From c46cddf958235d19a4f5f95133ee9a0ba019c7ab Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Wed, 20 Dec 2017 23:16:27 +0500 Subject: [PATCH 01/42] Reformat apiref.rst --- .gitignore | 4 +- docs/src/Makefile | 3 +- docs/src/_templates/class.rst | 15 + docs/src/_templates/function.rst | 10 + docs/src/apiref.rst | 385 ++++++++++++++---- docs/src/conf.py | 9 +- docs/src/corpora/bleicorpus.rst | 9 - docs/src/corpora/corpora.rst | 10 - docs/src/corpora/csvcorpus.rst | 9 - docs/src/corpora/dictionary.rst | 9 - docs/src/corpora/hashdictionary.rst | 9 - docs/src/corpora/indexedcorpus.rst | 16 - docs/src/corpora/lowcorpus.rst | 9 - docs/src/corpora/malletcorpus.rst | 9 - docs/src/corpora/mmcorpus.rst | 9 - docs/src/corpora/sharded_corpus.rst | 9 - docs/src/corpora/svmlightcorpus.rst | 9 - docs/src/corpora/textcorpus.rst | 9 - docs/src/corpora/ucicorpus.rst | 9 - docs/src/corpora/wikicorpus.rst | 9 - docs/src/interfaces.rst | 9 - docs/src/models/atmodel.rst | 9 - docs/src/models/basemodel.rst | 9 - docs/src/models/callbacks.rst | 9 - docs/src/models/coherencemodel.rst | 9 - docs/src/models/doc2vec.rst | 9 - docs/src/models/fasttext.rst | 9 - docs/src/models/hdpmodel.rst | 9 - docs/src/models/keyedvectors.rst | 9 - docs/src/models/lda_dispatcher.rst | 8 - docs/src/models/lda_worker.rst | 8 - docs/src/models/ldamodel.rst | 9 - docs/src/models/ldamulticore.rst | 9 - docs/src/models/ldaseqmodel.rst | 9 - docs/src/models/logentropy_model.rst | 9 - docs/src/models/lsi_dispatcher.rst | 8 - docs/src/models/lsi_worker.rst | 8 - docs/src/models/lsimodel.rst | 9 - docs/src/models/models.rst | 10 - docs/src/models/normmodel.rst | 9 - docs/src/models/phrases.rst | 9 - docs/src/models/rpmodel.rst | 8 - docs/src/models/tfidfmodel.rst | 9 - docs/src/models/translation_matrix.rst | 9 - docs/src/models/word2vec.rst | 9 - docs/src/models/wrappers/dtmmodel.rst | 9 - docs/src/models/wrappers/fasttext.rst | 9 - docs/src/models/wrappers/ldamallet.rst | 9 - docs/src/models/wrappers/ldavowpalwabbit.rst | 9 - docs/src/models/wrappers/varembed.rst | 9 - docs/src/models/wrappers/wordrank.rst | 9 - docs/src/models/wrappers/wrappers.rst | 10 - docs/src/parsing/porter.rst | 9 - docs/src/parsing/preprocessing.rst | 9 - docs/src/scripts/glove2word2vec.rst | 9 - docs/src/scripts/make_wiki_online.rst | 9 - docs/src/scripts/make_wiki_online_lemma.rst | 9 - docs/src/scripts/make_wiki_online_nodebug.rst | 9 - docs/src/scripts/make_wikicorpus.rst | 9 - docs/src/scripts/segment_wiki.rst | 9 - docs/src/scripts/word2vec2tensor.rst | 9 - docs/src/scripts/word2vec_standalone.rst | 9 - docs/src/similarities/docsim.rst | 8 - docs/src/similarities/index.rst | 8 - docs/src/sklearn_api/atmodel.rst | 9 - docs/src/sklearn_api/d2vmodel.rst | 9 - docs/src/sklearn_api/hdp.rst | 9 - docs/src/sklearn_api/ldamodel.rst | 9 - docs/src/sklearn_api/ldaseqmodel.rst | 9 - docs/src/sklearn_api/lsimodel.rst | 9 - docs/src/sklearn_api/phrases.rst | 9 - docs/src/sklearn_api/rpmodel.rst | 9 - docs/src/sklearn_api/text2bow.rst | 9 - docs/src/sklearn_api/tfidf.rst | 9 - docs/src/sklearn_api/w2vmodel.rst | 9 - docs/src/summarization/bm25.rst | 9 - docs/src/summarization/commons.rst | 9 - docs/src/summarization/graph.rst | 9 - docs/src/summarization/keywords.rst | 9 - docs/src/summarization/pagerank_weighted.rst | 9 - docs/src/summarization/summariser.rst | 9 - docs/src/summarization/syntactic_unit.rst | 9 - docs/src/summarization/textcleaner.rst | 10 - docs/src/topic_coherence/aggregation.rst | 9 - .../direct_confirmation_measure.rst | 9 - .../indirect_confirmation_measure.rst | 9 - .../probability_estimation.rst | 9 - docs/src/topic_coherence/segmentation.rst | 9 - docs/src/topic_coherence/text_analysis.rst | 9 - 89 files changed, 341 insertions(+), 836 deletions(-) create mode 100644 docs/src/_templates/class.rst create mode 100644 docs/src/_templates/function.rst delete mode 100644 docs/src/corpora/bleicorpus.rst delete mode 100644 docs/src/corpora/corpora.rst delete mode 100644 docs/src/corpora/csvcorpus.rst delete mode 100644 docs/src/corpora/dictionary.rst delete mode 100644 docs/src/corpora/hashdictionary.rst delete mode 100644 docs/src/corpora/indexedcorpus.rst delete mode 100644 docs/src/corpora/lowcorpus.rst delete mode 100644 docs/src/corpora/malletcorpus.rst delete mode 100644 docs/src/corpora/mmcorpus.rst delete mode 100644 docs/src/corpora/sharded_corpus.rst delete mode 100644 docs/src/corpora/svmlightcorpus.rst delete mode 100644 docs/src/corpora/textcorpus.rst delete mode 100644 docs/src/corpora/ucicorpus.rst delete mode 100644 docs/src/corpora/wikicorpus.rst delete mode 100644 docs/src/interfaces.rst delete mode 100644 docs/src/models/atmodel.rst delete mode 100644 docs/src/models/basemodel.rst delete mode 100644 docs/src/models/callbacks.rst delete mode 100644 docs/src/models/coherencemodel.rst delete mode 100644 docs/src/models/doc2vec.rst delete mode 100644 docs/src/models/fasttext.rst delete mode 100644 docs/src/models/hdpmodel.rst delete mode 100644 docs/src/models/keyedvectors.rst delete mode 100644 docs/src/models/lda_dispatcher.rst delete mode 100644 docs/src/models/lda_worker.rst delete mode 100644 docs/src/models/ldamodel.rst delete mode 100644 docs/src/models/ldamulticore.rst delete mode 100644 docs/src/models/ldaseqmodel.rst delete mode 100644 docs/src/models/logentropy_model.rst delete mode 100644 docs/src/models/lsi_dispatcher.rst delete mode 100644 docs/src/models/lsi_worker.rst delete mode 100644 docs/src/models/lsimodel.rst delete mode 100644 docs/src/models/models.rst delete mode 100644 docs/src/models/normmodel.rst delete mode 100644 docs/src/models/phrases.rst delete mode 100644 docs/src/models/rpmodel.rst delete mode 100644 docs/src/models/tfidfmodel.rst delete mode 100644 docs/src/models/translation_matrix.rst delete mode 100644 docs/src/models/word2vec.rst delete mode 100644 docs/src/models/wrappers/dtmmodel.rst delete mode 100644 docs/src/models/wrappers/fasttext.rst delete mode 100644 docs/src/models/wrappers/ldamallet.rst delete mode 100644 docs/src/models/wrappers/ldavowpalwabbit.rst delete mode 100644 docs/src/models/wrappers/varembed.rst delete mode 100644 docs/src/models/wrappers/wordrank.rst delete mode 100644 docs/src/models/wrappers/wrappers.rst delete mode 100644 docs/src/parsing/porter.rst delete mode 100644 docs/src/parsing/preprocessing.rst delete mode 100644 docs/src/scripts/glove2word2vec.rst delete mode 100644 docs/src/scripts/make_wiki_online.rst delete mode 100644 docs/src/scripts/make_wiki_online_lemma.rst delete mode 100644 docs/src/scripts/make_wiki_online_nodebug.rst delete mode 100644 docs/src/scripts/make_wikicorpus.rst delete mode 100644 docs/src/scripts/segment_wiki.rst delete mode 100644 docs/src/scripts/word2vec2tensor.rst delete mode 100644 docs/src/scripts/word2vec_standalone.rst delete mode 100644 docs/src/similarities/docsim.rst delete mode 100644 docs/src/similarities/index.rst delete mode 100644 docs/src/sklearn_api/atmodel.rst delete mode 100644 docs/src/sklearn_api/d2vmodel.rst delete mode 100644 docs/src/sklearn_api/hdp.rst delete mode 100644 docs/src/sklearn_api/ldamodel.rst delete mode 100644 docs/src/sklearn_api/ldaseqmodel.rst delete mode 100644 docs/src/sklearn_api/lsimodel.rst delete mode 100644 docs/src/sklearn_api/phrases.rst delete mode 100644 docs/src/sklearn_api/rpmodel.rst delete mode 100644 docs/src/sklearn_api/text2bow.rst delete mode 100644 docs/src/sklearn_api/tfidf.rst delete mode 100644 docs/src/sklearn_api/w2vmodel.rst delete mode 100644 docs/src/summarization/bm25.rst delete mode 100644 docs/src/summarization/commons.rst delete mode 100644 docs/src/summarization/graph.rst delete mode 100644 docs/src/summarization/keywords.rst delete mode 100644 docs/src/summarization/pagerank_weighted.rst delete mode 100644 docs/src/summarization/summariser.rst delete mode 100644 docs/src/summarization/syntactic_unit.rst delete mode 100644 docs/src/summarization/textcleaner.rst delete mode 100644 docs/src/topic_coherence/aggregation.rst delete mode 100644 docs/src/topic_coherence/direct_confirmation_measure.rst delete mode 100644 docs/src/topic_coherence/indirect_confirmation_measure.rst delete mode 100644 docs/src/topic_coherence/probability_estimation.rst delete mode 100644 docs/src/topic_coherence/segmentation.rst delete mode 100644 docs/src/topic_coherence/text_analysis.rst diff --git a/.gitignore b/.gitignore index 6939309d25..fb258a55ee 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,8 @@ Thumbs.db .eggs cython_debug docs/src/_build/ +docs/src/generated/ +docs/src/auto_examples/ docs/_static docs/notebooks/.ipynb_checkpoints dedan_gensim.tmproj @@ -72,4 +74,4 @@ data *_out.txt *.html *.inv -*.js \ No newline at end of file +*.js diff --git a/docs/src/Makefile b/docs/src/Makefile index be62859ff7..30144caf21 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -32,6 +32,7 @@ help: clean: -rm -rf $(BUILDDIR)/* + -rm -rf generated/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @@ -40,7 +41,7 @@ html: @echo @echo "Build finished. The HTML pages are in ../" -upload: +upload: scp -r _build/html/* rr:public_html/gensim/ dirhtml: diff --git a/docs/src/_templates/class.rst b/docs/src/_templates/class.rst new file mode 100644 index 0000000000..54853226b2 --- /dev/null +++ b/docs/src/_templates/class.rst @@ -0,0 +1,15 @@ +:mod:`{{module}}`.{{objname}} +{{ underline }}============== + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + :members: + + {% block methods %} + .. automethod:: __init__ + {% endblock %} + +.. raw:: html + +
diff --git a/docs/src/_templates/function.rst b/docs/src/_templates/function.rst new file mode 100644 index 0000000000..d8c9bd4807 --- /dev/null +++ b/docs/src/_templates/function.rst @@ -0,0 +1,10 @@ +:mod:`{{module}}`.{{objname}} +{{ underline }}==================== + +.. currentmodule:: {{ module }} + +.. autofunction:: {{ objname }} + +.. raw:: html + +
diff --git a/docs/src/apiref.rst b/docs/src/apiref.rst index b781ef16d6..0293dce09e 100644 --- a/docs/src/apiref.rst +++ b/docs/src/apiref.rst @@ -1,5 +1,4 @@ -.. _apiref: - +============= API Reference ============= @@ -8,86 +7,308 @@ Modules: .. toctree:: :maxdepth: 0 - interfaces utils matutils downloader - corpora/bleicorpus - corpora/csvcorpus - corpora/dictionary - corpora/hashdictionary - corpora/indexedcorpus - corpora/lowcorpus - corpora/malletcorpus - corpora/mmcorpus - corpora/sharded_corpus - corpora/svmlightcorpus - corpora/textcorpus - corpora/ucicorpus - corpora/wikicorpus - models/ldamodel - models/ldamulticore - models/lsimodel - models/ldaseqmodel - models/tfidfmodel - models/rpmodel - models/hdpmodel - models/logentropy_model - models/normmodel - models/translation_matrix - models/lsi_dispatcher - models/lsi_worker - models/lda_dispatcher - models/lda_worker - models/atmodel - models/word2vec - models/keyedvectors - models/doc2vec - models/fasttext - models/phrases - models/coherencemodel - models/basemodel - models/callbacks - models/wrappers/ldamallet - models/wrappers/dtmmodel - models/wrappers/ldavowpalwabbit.rst - models/wrappers/wordrank - models/wrappers/varembed - models/wrappers/fasttext - similarities/docsim - similarities/index - sklearn_api/atmodel - sklearn_api/d2vmodel - sklearn_api/hdp - sklearn_api/ldamodel - sklearn_api/ldaseqmodel - sklearn_api/lsimodel - sklearn_api/phrases - sklearn_api/rpmodel - sklearn_api/text2bow - sklearn_api/tfidf - sklearn_api/w2vmodel - topic_coherence/aggregation - topic_coherence/direct_confirmation_measure - topic_coherence/indirect_confirmation_measure - topic_coherence/probability_estimation - topic_coherence/segmentation - topic_coherence/text_analysis - scripts/glove2word2vec - scripts/make_wikicorpus - scripts/word2vec_standalone - scripts/make_wiki_online - scripts/make_wiki_online_lemma - scripts/make_wiki_online_nodebug - scripts/word2vec2tensor - scripts/segment_wiki - parsing/porter - parsing/preprocessing - summarization/bm25 - summarization/commons - summarization/graph - summarization/keywords - summarization/pagerank_weighted - summarization/summariser - summarization/syntactic_unit - summarization/textcleaner + +.. _interfaces_ref: + +:mod:`gensim.interfaces`: Interfaces +==================================== + +.. automodule:: gensim.interfaces + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.interfaces + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + CorpusABC + TransformedCorpus + TransformationABC + SimilarityABC + +.. _corpora_ref: + +:mod:`gensim.corpora`: Corpora +============================== + +.. automodule:: gensim.corpora + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.corpora + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + bleicorpus.BleiCorpus + csvcorpus.CsvCorpus + dictionary.Dictionary + hashdictionary.HashDictionary + indexedcorpus.IndexedCorpus + lowcorpus.LowCorpus + malletcorpus.MalletCorpus + mmcorpus.MmCorpus + sharded_corpus.ShardedCorpus + svmlightcorpus.SvmLightCorpus + textcorpus.TextCorpus + ucicorpus.UciCorpus + wikicorpus.WikiCorpus + +.. _models_ref: + +:mod:`gensim.models`: Models +============================ + +.. automodule:: gensim.models + :no-members: + :no-inherited-members: + +Models +------ +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ldamodel.LdaModel + ldamulticore.LdaMulticore + ldaseqmodel.LdaSeqModel + tfidfmodel.TfidfModel + rpmodel.RpModel + hdpmodel.HdpModel + logentropy_model.LogEntropyModel + normmodel.NormModel + translation_matrix.TranslationMatrix + lsi_dispatcher.Dispatcher + lsi_worker.Worker + lda_dispatcher.Dispatcher + lda_worker.Worker + atmodel.AuthorTopicModel + word2vec.Word2Vec + keyedvectors.KeyedVectors + doc2vec.Doc2Vec + fasttext.FastText + phrases.SentenceAnalyzer + phrases.Phrases + phrases.Phraser + coherencemodel.CoherenceModel + basemodel.BaseTopicModel + callbacks.Callback + +Wrappers +-------- +.. currentmodule:: gensim.models.wrappers + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ldamallet.LdaMallet + dtmmodel.DtmModel + ldavowpalwabbit.LdaVowpalWabbit + wordrank.Wordrank + varembed.VarEmbed + fasttext.FastText + +.. _similarities_ref: + +:mod:`gensim.similarities`: Similarities +======================================== + +.. automodule:: gensim.similarities + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.similarities + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + docsim.Shard + docsim.Similarity + docsim.MatrixSimilarity + docsim.SparseMatrixSimilarity + index.AnnoyIndexer + +.. _sklearn_api_ref: + +:mod:`gensim.sklearn_api`: Sklearn API +====================================== + +.. automodule:: gensim.sklearn_api + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.sklearn_api + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + atmodel.AuthorTopicTransformer + d2vmodel.D2VTransformer + hdp.HdpTransformer + ldamodel.LdaTransformer + ldaseqmodel.LdaSeqTransformer + lsimodel.LsiTransformer + phrases.PhrasesTransformer + rpmodel.RpTransformer + text2bow.Text2BowTransformer + tfidf.TfIdfTransformer + w2vmodel.W2VTransformer + +.. _topic_coherence_ref: + +:mod:`gensim.topic_coherence`: Topic Coherence +============================================== + +.. automodule:: gensim.topic_coherence + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.topic_coherence + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + indirect_confirmation_measure.ContextVectorComputer + text_analysis.BaseAnalyzer + text_analysis.UsesDictionary + text_analysis.InvertedIndexBased + text_analysis.CorpusAccumulator + text_analysis.WindowedTextsAnalyzer + text_analysis.InvertedIndexAccumulator + text_analysis.WordOccurrenceAccumulator + text_analysis.PatchedWordOccurrenceAccumulator + text_analysis.ParallelWordOccurrenceAccumulator + text_analysis.AccumulatingWorker + text_analysis.WordVectorsAccumulator + +Functions +--------- +.. currentmodule:: gensim.topic_coherence + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + aggregation.arithmetic_mean + direct_confirmation_measure.log_conditional_probability + direct_confirmation_measure.aggregate_segment_sims + direct_confirmation_measure.log_ratio_measure + indirect_confirmation_measure.word2vec_similarity + indirect_confirmation_measure.cosine_similarity + probability_estimation.p_boolean_document + probability_estimation.p_boolean_sliding_window + probability_estimation.p_word2vec + probability_estimation.unique_ids_from_segments + segmentation.s_one_pre + segmentation.s_one_one + segmentation.s_one_set + +.. _scripts_ref: + +:mod:`gensim.scripts`: Scripts +============================== + +.. automodule:: gensim.scripts + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.scripts + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + glove2word2vec.get_glove_info + glove2word2vec.glove2word2vec + word2vec2tensor.word2vec2tensor + segment_wiki.segment_all_articles + segment_wiki.segment_and_write_all_articles + segment_wiki.extract_page_xmls + segment_wiki.segment + +.. _parsing_ref: + +:mod:`gensim.parsing`: Parsing +============================== + +.. automodule:: gensim.parsing + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + porter.PorterStemmer + +Functions +--------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + preprocessing.remove_stopwords + preprocessing.strip_punctuation + preprocessing.strip_tags + preprocessing.strip_short + preprocessing.strip_numeric + preprocessing.strip_non_alphanum + preprocessing.strip_multiple_whitespaces + preprocessing.split_alphanum + preprocessing.stem_text + preprocessing.preprocess_string + preprocessing.preprocess_documents + preprocessing.read_file + preprocessing.read_files + +.. _summarization_ref: + +:mod:`gensim.summarization`: Summarization +========================================== + +.. automodule:: gensim.summarization + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.summarization + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + summarizer.summarize + summarizer.summarize_corpus + bm25.get_bm25_weights + keywords.keywords diff --git a/docs/src/conf.py b/docs/src/conf.py index c09ca5d3bb..2b6a579efd 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -25,12 +25,19 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinxcontrib.napoleon'] +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.napoleon' +] + autoclass_content = "both" # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] +autosummary_generate = True + # The suffix of source filenames. source_suffix = '.rst' diff --git a/docs/src/corpora/bleicorpus.rst b/docs/src/corpora/bleicorpus.rst deleted file mode 100644 index c241a5592d..0000000000 --- a/docs/src/corpora/bleicorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.bleicorpus` -- Corpus in Blei's LDA-C format -========================================================== - -.. automodule:: gensim.corpora.bleicorpus - :synopsis: Corpus in Blei's LDA-C format - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/corpora.rst b/docs/src/corpora/corpora.rst deleted file mode 100644 index f92a68af71..0000000000 --- a/docs/src/corpora/corpora.rst +++ /dev/null @@ -1,10 +0,0 @@ -:orphan: - -:mod:`corpora` -- Package for corpora I/O -========================================== - -.. automodule:: gensim.corpora - :synopsis: Package for corpora I/O - :members: - :inherited-members: - diff --git a/docs/src/corpora/csvcorpus.rst b/docs/src/corpora/csvcorpus.rst deleted file mode 100644 index 17729e0fae..0000000000 --- a/docs/src/corpora/csvcorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.csvcorpus` -- Corpus in CSV format -========================================================== - -.. automodule:: gensim.corpora.csvcorpus - :synopsis: Corpus in CSV format - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/dictionary.rst b/docs/src/corpora/dictionary.rst deleted file mode 100644 index 5f83082832..0000000000 --- a/docs/src/corpora/dictionary.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.dictionary` -- Construct word<->id mappings -========================================================== - -.. automodule:: gensim.corpora.dictionary - :synopsis: Construct word<->id mappings - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/hashdictionary.rst b/docs/src/corpora/hashdictionary.rst deleted file mode 100644 index 3dcde65da5..0000000000 --- a/docs/src/corpora/hashdictionary.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.hashdictionary` -- Construct word<->id mappings -============================================================= - -.. automodule:: gensim.corpora.hashdictionary - :synopsis: Construct word<->id mappings on the fly (the "hashing trick") - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/indexedcorpus.rst b/docs/src/corpora/indexedcorpus.rst deleted file mode 100644 index a798bc8bbf..0000000000 --- a/docs/src/corpora/indexedcorpus.rst +++ /dev/null @@ -1,16 +0,0 @@ -:mod:`corpora.indexedcorpus` -- Random access to corpus documents -================================================================= - -.. automodule:: gensim.corpora.indexedcorpus - :synopsis: Random access to corpus documents - :members: - :inherited-members: - :undoc-members: - :show-inheritance: - - -.. autoclass:: IndexedCorpus - :members: - :inherited-members: - :undoc-members: - :show-inheritance: \ No newline at end of file diff --git a/docs/src/corpora/lowcorpus.rst b/docs/src/corpora/lowcorpus.rst deleted file mode 100644 index 5d084b7c58..0000000000 --- a/docs/src/corpora/lowcorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.lowcorpus` -- Corpus in List-of-Words format -=========================================================== - -.. automodule:: gensim.corpora.lowcorpus - :synopsis: Corpus in List-of-Words format - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/malletcorpus.rst b/docs/src/corpora/malletcorpus.rst deleted file mode 100644 index 184b832dc5..0000000000 --- a/docs/src/corpora/malletcorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.malletcorpus` -- Corpus in Mallet format of List-Of-Words. -======================================================================== - -.. automodule:: gensim.corpora.malletcorpus - :synopsis: Corpus in Mallet format of List-Of-Words. - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/mmcorpus.rst b/docs/src/corpora/mmcorpus.rst deleted file mode 100644 index caad094b0c..0000000000 --- a/docs/src/corpora/mmcorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.mmcorpus` -- Corpus in Matrix Market format -========================================================== - -.. automodule:: gensim.corpora.mmcorpus - :synopsis: Corpus in Matrix Market format - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/sharded_corpus.rst b/docs/src/corpora/sharded_corpus.rst deleted file mode 100644 index 74831b11bb..0000000000 --- a/docs/src/corpora/sharded_corpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.sharded_corpus` -- Corpus stored in separate files -================================================================ - -.. automodule:: gensim.corpora.sharded_corpus - :synopsis: Numpy arrays on disk for iterative processing - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/svmlightcorpus.rst b/docs/src/corpora/svmlightcorpus.rst deleted file mode 100644 index 0d1c3b10ea..0000000000 --- a/docs/src/corpora/svmlightcorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.svmlightcorpus` -- Corpus in SVMlight format -================================================================== - -.. automodule:: gensim.corpora.svmlightcorpus - :synopsis: Corpus in SVMlight format - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/textcorpus.rst b/docs/src/corpora/textcorpus.rst deleted file mode 100644 index f0f3598a75..0000000000 --- a/docs/src/corpora/textcorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.textcorpus` -- Building corpora with dictionaries -================================================================= - -.. automodule:: gensim.corpora.textcorpus - :synopsis: Building corpora with dictionaries - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/ucicorpus.rst b/docs/src/corpora/ucicorpus.rst deleted file mode 100644 index 75f6908478..0000000000 --- a/docs/src/corpora/ucicorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.ucicorpus` -- Corpus in UCI bag-of-words format -============================================================================================================== - -.. automodule:: gensim.corpora.ucicorpus - :synopsis: Corpus in University of California, Irvine (UCI) bag-of-words format - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/corpora/wikicorpus.rst b/docs/src/corpora/wikicorpus.rst deleted file mode 100644 index 31787ab10c..0000000000 --- a/docs/src/corpora/wikicorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora.wikicorpus` -- Corpus from a Wikipedia dump -========================================================== - -.. automodule:: gensim.corpora.wikicorpus - :synopsis: Corpus from a Wikipedia dump - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/interfaces.rst b/docs/src/interfaces.rst deleted file mode 100644 index 07f3c4e669..0000000000 --- a/docs/src/interfaces.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`interfaces` -- Core gensim interfaces -============================================ - -.. automodule:: gensim.interfaces - :synopsis: Core gensim interfaces - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/atmodel.rst b/docs/src/models/atmodel.rst deleted file mode 100644 index 5cf943d2f7..0000000000 --- a/docs/src/models/atmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.atmodel` -- Author-topic models -====================================================== - -.. automodule:: gensim.models.atmodel - :synopsis: Author-topic model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/basemodel.rst b/docs/src/models/basemodel.rst deleted file mode 100644 index 88de81128e..0000000000 --- a/docs/src/models/basemodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.basemodel` -- Core TM interface -============================================ - -.. automodule:: gensim.models.basemodel - :synopsis: Core TM interface - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/callbacks.rst b/docs/src/models/callbacks.rst deleted file mode 100644 index ff9f870993..0000000000 --- a/docs/src/models/callbacks.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.callbacks` -- Callbacks for track and viz LDA train process -======================================================================== - -.. automodule:: gensim.models.callbacks - :synopsis: Callbacks for track and viz LDA train process - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/coherencemodel.rst b/docs/src/models/coherencemodel.rst deleted file mode 100644 index 6eec17e691..0000000000 --- a/docs/src/models/coherencemodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.coherencemodel` -- Topic coherence pipeline -======================================================== - -.. automodule:: gensim.models.coherencemodel - :synopsis: Topic coherence pipeline - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/doc2vec.rst b/docs/src/models/doc2vec.rst deleted file mode 100644 index f2da8bb722..0000000000 --- a/docs/src/models/doc2vec.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.doc2vec` -- Deep learning with paragraph2vec -========================================================= - -.. automodule:: gensim.models.doc2vec - :synopsis: Deep learning with doc2vec - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/fasttext.rst b/docs/src/models/fasttext.rst deleted file mode 100644 index 13a8d86a2c..0000000000 --- a/docs/src/models/fasttext.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.fasttext` -- FastText model -======================================== - -.. automodule:: gensim.models.fasttext - :synopsis: FastText model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/hdpmodel.rst b/docs/src/models/hdpmodel.rst deleted file mode 100644 index 713f420a3b..0000000000 --- a/docs/src/models/hdpmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.hdpmodel` -- Hierarchical Dirichlet Process -======================================================== - -.. automodule:: gensim.models.hdpmodel - :synopsis: Hierarchical Dirichlet Process - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/keyedvectors.rst b/docs/src/models/keyedvectors.rst deleted file mode 100644 index db07e034e8..0000000000 --- a/docs/src/models/keyedvectors.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.keyedvectors` -- Store and query word vectors -========================================================== - -.. automodule:: gensim.models.keyedvectors - :synopsis: Store and query word vectors - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/lda_dispatcher.rst b/docs/src/models/lda_dispatcher.rst deleted file mode 100644 index f6dffd28e1..0000000000 --- a/docs/src/models/lda_dispatcher.rst +++ /dev/null @@ -1,8 +0,0 @@ -:mod:`models.lda_dispatcher` -- Dispatcher for distributed LDA -================================================================ - -.. automodule:: gensim.models.lda_dispatcher - :synopsis: Dispatcher for distributed LDA - :members: - :inherited-members: - diff --git a/docs/src/models/lda_worker.rst b/docs/src/models/lda_worker.rst deleted file mode 100644 index 381556eaa6..0000000000 --- a/docs/src/models/lda_worker.rst +++ /dev/null @@ -1,8 +0,0 @@ -:mod:`models.lda_worker` -- Worker for distributed LDA -====================================================== - -.. automodule:: gensim.models.lda_worker - :synopsis: Worker for distributed LDA - :members: - :inherited-members: - diff --git a/docs/src/models/ldamodel.rst b/docs/src/models/ldamodel.rst deleted file mode 100644 index 2dfb736ea6..0000000000 --- a/docs/src/models/ldamodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.ldamodel` -- Latent Dirichlet Allocation -====================================================== - -.. automodule:: gensim.models.ldamodel - :synopsis: Latent Dirichlet Allocation - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/ldamulticore.rst b/docs/src/models/ldamulticore.rst deleted file mode 100644 index 9820fdb76f..0000000000 --- a/docs/src/models/ldamulticore.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.ldamulticore` -- parallelized Latent Dirichlet Allocation -====================================================================== - -.. automodule:: gensim.models.ldamulticore - :synopsis: Latent Dirichlet Allocation - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/ldaseqmodel.rst b/docs/src/models/ldaseqmodel.rst deleted file mode 100644 index 48114f2639..0000000000 --- a/docs/src/models/ldaseqmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.ldaseqmodel` -- Dynamic Topic Modeling in Python -============================================================= - -.. automodule:: gensim.models.ldaseqmodel - :synopsis: Dynamic Topic Modeling in Python - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/logentropy_model.rst b/docs/src/models/logentropy_model.rst deleted file mode 100644 index 628d8384f3..0000000000 --- a/docs/src/models/logentropy_model.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.logentropy_model` -- LogEntropy model -====================================================== - -.. automodule:: gensim.models.logentropy_model - :synopsis: LogEntropy model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/lsi_dispatcher.rst b/docs/src/models/lsi_dispatcher.rst deleted file mode 100644 index 59bc80e35c..0000000000 --- a/docs/src/models/lsi_dispatcher.rst +++ /dev/null @@ -1,8 +0,0 @@ -:mod:`models.lsi_dispatcher` -- Dispatcher for distributed LSI -=============================================================== - -.. automodule:: gensim.models.lsi_dispatcher - :synopsis: Dispatcher for distributed LSI - :members: - :inherited-members: - diff --git a/docs/src/models/lsi_worker.rst b/docs/src/models/lsi_worker.rst deleted file mode 100644 index baf999f105..0000000000 --- a/docs/src/models/lsi_worker.rst +++ /dev/null @@ -1,8 +0,0 @@ -:mod:`models.lsi_worker` -- Worker for distributed LSI -====================================================== - -.. automodule:: gensim.models.lsi_worker - :synopsis: Worker for distributed LSI - :members: - :inherited-members: - diff --git a/docs/src/models/lsimodel.rst b/docs/src/models/lsimodel.rst deleted file mode 100644 index fec09efbf4..0000000000 --- a/docs/src/models/lsimodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.lsimodel` -- Latent Semantic Indexing -====================================================== - -.. automodule:: gensim.models.lsimodel - :synopsis: Latent Semantic Indexing - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/models.rst b/docs/src/models/models.rst deleted file mode 100644 index 0ac3b30831..0000000000 --- a/docs/src/models/models.rst +++ /dev/null @@ -1,10 +0,0 @@ -:orphan: - -:mod:`models` -- Package for transformation models -====================================================== - -.. automodule:: gensim.models - :synopsis: Package for transformation models - :members: - :inherited-members: - diff --git a/docs/src/models/normmodel.rst b/docs/src/models/normmodel.rst deleted file mode 100644 index d1a12e2af4..0000000000 --- a/docs/src/models/normmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.normmodel` -- Normalization model -=============================================== - -.. automodule:: gensim.models.normmodel - :synopsis: Normalization model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/phrases.rst b/docs/src/models/phrases.rst deleted file mode 100644 index faee68232b..0000000000 --- a/docs/src/models/phrases.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.phrases` -- Phrase (collocation) detection -======================================================= - -.. automodule:: gensim.models.phrases - :synopsis: Phrase (collocation) detection - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/rpmodel.rst b/docs/src/models/rpmodel.rst deleted file mode 100644 index 47eba01262..0000000000 --- a/docs/src/models/rpmodel.rst +++ /dev/null @@ -1,8 +0,0 @@ -:mod:`models.rpmodel` -- Random Projections -====================================================== - -.. automodule:: gensim.models.rpmodel - :synopsis: Random Projections - :members: - :inherited-members: - diff --git a/docs/src/models/tfidfmodel.rst b/docs/src/models/tfidfmodel.rst deleted file mode 100644 index 6b622d7589..0000000000 --- a/docs/src/models/tfidfmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.tfidfmodel` -- TF-IDF model -====================================================== - -.. automodule:: gensim.models.tfidfmodel - :synopsis: TF-IDF model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/translation_matrix.rst b/docs/src/models/translation_matrix.rst deleted file mode 100644 index ea658da00b..0000000000 --- a/docs/src/models/translation_matrix.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.translation_matrix` -- Translation Matrix model -============================================================= - -.. automodule:: gensim.models.translation_matrix - :synopsis: Translation Matrix - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/word2vec.rst b/docs/src/models/word2vec.rst deleted file mode 100644 index 1679429e22..0000000000 --- a/docs/src/models/word2vec.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.word2vec` -- Deep learning with word2vec -====================================================== - -.. automodule:: gensim.models.word2vec - :synopsis: Deep learning with word2vec - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/wrappers/dtmmodel.rst b/docs/src/models/wrappers/dtmmodel.rst deleted file mode 100644 index 00db4c105a..0000000000 --- a/docs/src/models/wrappers/dtmmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.wrappers.dtmmodel` -- Dynamic Topic Models (DTM) and Dynamic Influence Models (DIM) -================================================================================================ - -.. automodule:: gensim.models.wrappers.dtmmodel - :synopsis: Dynamic Topic Models - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/wrappers/fasttext.rst b/docs/src/models/wrappers/fasttext.rst deleted file mode 100644 index 84877c2ca3..0000000000 --- a/docs/src/models/wrappers/fasttext.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.wrappers.fasttext` -- FastText Word Embeddings -=========================================================== - -.. automodule:: gensim.models.wrappers.fasttext - :synopsis: FastText Embeddings - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/wrappers/ldamallet.rst b/docs/src/models/wrappers/ldamallet.rst deleted file mode 100644 index 309fbd9cd1..0000000000 --- a/docs/src/models/wrappers/ldamallet.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.wrappers.ldamallet` -- Latent Dirichlet Allocation via Mallet -========================================================================== - -.. automodule:: gensim.models.wrappers.ldamallet - :synopsis: Latent Dirichlet Allocation via Mallet - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/wrappers/ldavowpalwabbit.rst b/docs/src/models/wrappers/ldavowpalwabbit.rst deleted file mode 100644 index 4199184153..0000000000 --- a/docs/src/models/wrappers/ldavowpalwabbit.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.wrappers.ldavowpalwabbit` -- Latent Dirichlet Allocation via Vowpal Wabbit -======================================================================================= - -.. automodule:: gensim.models.wrappers.ldavowpalwabbit - :synopsis: Latent Dirichlet Allocation via Vowpal Wabbit - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/wrappers/varembed.rst b/docs/src/models/wrappers/varembed.rst deleted file mode 100644 index 411025582d..0000000000 --- a/docs/src/models/wrappers/varembed.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.wrappers.varembed` -- VarEmbed Word Embeddings -================================================================================================ - -.. automodule:: gensim.models.wrappers.varembed - :synopsis: VarEmbed Word Embeddings - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/wrappers/wordrank.rst b/docs/src/models/wrappers/wordrank.rst deleted file mode 100644 index 25f791ab88..0000000000 --- a/docs/src/models/wrappers/wordrank.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.wrappers.wordrank` -- Word Embeddings from WordRank -================================================================================================ - -.. automodule:: gensim.models.wrappers.wordrank - :synopsis: Wordrank Embeddings - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/wrappers/wrappers.rst b/docs/src/models/wrappers/wrappers.rst deleted file mode 100644 index 9746202d6d..0000000000 --- a/docs/src/models/wrappers/wrappers.rst +++ /dev/null @@ -1,10 +0,0 @@ -:orphan: - -:mod:`models.wrappers` -- Package for transformation models via external programs -================================================================================= - -.. automodule:: gensim.models.wrappers - :synopsis: Package for transformation models via external programs - :members: - :inherited-members: - diff --git a/docs/src/parsing/porter.rst b/docs/src/parsing/porter.rst deleted file mode 100644 index 4b8d68c5d8..0000000000 --- a/docs/src/parsing/porter.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`parsing.porter` -- Porter Stemming Algorithm -========================================================= - -.. automodule:: gensim.parsing.porter - :synopsis: Porter Stemming Algorithm - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/parsing/preprocessing.rst b/docs/src/parsing/preprocessing.rst deleted file mode 100644 index 36a2236d07..0000000000 --- a/docs/src/parsing/preprocessing.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`parsing.preprocessing` -- Functions to preprocess raw text -================================================================ - -.. automodule:: gensim.parsing.preprocessing - :synopsis: Functions to preprocess raw text - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/glove2word2vec.rst b/docs/src/scripts/glove2word2vec.rst deleted file mode 100644 index 792b720f71..0000000000 --- a/docs/src/scripts/glove2word2vec.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.glove2word2vec` -- Convert glove format to word2vec -================================================================= - -.. automodule:: gensim.scripts.glove2word2vec - :synopsis: Convert glove format to word2vec - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/make_wiki_online.rst b/docs/src/scripts/make_wiki_online.rst deleted file mode 100644 index fc4e99c839..0000000000 --- a/docs/src/scripts/make_wiki_online.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.make_wiki_online` -- Convert articles from a Wikipedia dump -========================================================================= - -.. automodule:: gensim.scripts.make_wiki_online - :synopsis: Convert articles from a Wikipedia dump - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/make_wiki_online_lemma.rst b/docs/src/scripts/make_wiki_online_lemma.rst deleted file mode 100644 index 34b821f775..0000000000 --- a/docs/src/scripts/make_wiki_online_lemma.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.make_wiki_online_lemma` -- Convert articles from a Wikipedia dump -=============================================================================== - -.. automodule:: gensim.scripts.make_wiki_online_lemma - :synopsis: Convert articles from a Wikipedia dump - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/make_wiki_online_nodebug.rst b/docs/src/scripts/make_wiki_online_nodebug.rst deleted file mode 100644 index 7558549188..0000000000 --- a/docs/src/scripts/make_wiki_online_nodebug.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.make_wiki_online_nodebug` -- Convert articles from a Wikipedia dump -================================================================================= - -.. automodule:: gensim.scripts.make_wiki_online_nodebug - :synopsis: Convert articles from a Wikipedia dump - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/make_wikicorpus.rst b/docs/src/scripts/make_wikicorpus.rst deleted file mode 100644 index 56607bd222..0000000000 --- a/docs/src/scripts/make_wikicorpus.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.make_wikicorpus` -- Convert articles from a Wikipedia dump to vectors. -==================================================================================== - -.. automodule:: gensim.scripts.make_wikicorpus - :synopsis: Convert articles from a Wikipedia dump to vectors. - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/segment_wiki.rst b/docs/src/scripts/segment_wiki.rst deleted file mode 100644 index 1c1846c8e5..0000000000 --- a/docs/src/scripts/segment_wiki.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.segment_wiki` -- Convert wikipedia dump to json-line format -========================================================================= - -.. automodule:: gensim.scripts.segment_wiki - :synopsis: Convert wikipedia dump to json-line format. - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/word2vec2tensor.rst b/docs/src/scripts/word2vec2tensor.rst deleted file mode 100644 index 6fb4e33482..0000000000 --- a/docs/src/scripts/word2vec2tensor.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.word2vec2tensor` -- Convert the word2vec format to Tensorflow 2D tensor -===================================================================================== - -.. automodule:: gensim.scripts.word2vec2tensor - :synopsis: Convert the word2vec format to Tensorflow 2D tensor - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/scripts/word2vec_standalone.rst b/docs/src/scripts/word2vec_standalone.rst deleted file mode 100644 index 85e7505b47..0000000000 --- a/docs/src/scripts/word2vec_standalone.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`scripts.word2vec_standalone` -- Train word2vec on text file CORPUS -======================================================================== - -.. automodule:: gensim.scripts.word2vec_standalone - :synopsis: Train word2vec on text file CORPUS - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/similarities/docsim.rst b/docs/src/similarities/docsim.rst deleted file mode 100644 index 9d330f23b9..0000000000 --- a/docs/src/similarities/docsim.rst +++ /dev/null @@ -1,8 +0,0 @@ -:mod:`similarities.docsim` -- Document similarity queries -======================================================================== - -.. automodule:: gensim.similarities.docsim - :synopsis: Document similarity queries - :members: - :inherited-members: - diff --git a/docs/src/similarities/index.rst b/docs/src/similarities/index.rst deleted file mode 100644 index 169b26b740..0000000000 --- a/docs/src/similarities/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -:mod:`similarities.index` -- Fast Approximate Nearest Neighbor Similarity with Annoy package -============================================================================================ - -.. automodule:: gensim.similarities.index - :synopsis: Fast Approximate Nearest Neighbor Similarity with Annoy package - :members: - :inherited-members: - diff --git a/docs/src/sklearn_api/atmodel.rst b/docs/src/sklearn_api/atmodel.rst deleted file mode 100644 index 4f935f0498..0000000000 --- a/docs/src/sklearn_api/atmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.atmodel` -- Scikit learn wrapper for Author-topic model -========================================================================= - -.. automodule:: gensim.sklearn_api.atmodel - :synopsis: Scikit learn wrapper for Author-topic model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/d2vmodel.rst b/docs/src/sklearn_api/d2vmodel.rst deleted file mode 100644 index 707daae639..0000000000 --- a/docs/src/sklearn_api/d2vmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.d2vmodel` -- Scikit learn wrapper for paragraph2vec model -=========================================================================== - -.. automodule:: gensim.sklearn_api.d2vmodel - :synopsis: Scikit learn wrapper for paragraph2vec model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/hdp.rst b/docs/src/sklearn_api/hdp.rst deleted file mode 100644 index 80e0fb0c70..0000000000 --- a/docs/src/sklearn_api/hdp.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.hdp` -- Scikit learn wrapper for Hierarchical Dirichlet Process model -======================================================================================= - -.. automodule:: gensim.sklearn_api.hdp - :synopsis: Scikit learn wrapper for Hierarchical Dirichlet Process model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/ldamodel.rst b/docs/src/sklearn_api/ldamodel.rst deleted file mode 100644 index 3ae03f8b61..0000000000 --- a/docs/src/sklearn_api/ldamodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.ldamodel` -- Scikit learn wrapper for Latent Dirichlet Allocation -=================================================================================== - -.. automodule:: gensim.sklearn_api.ldamodel - :synopsis: Scikit learn wrapper for LDA model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/ldaseqmodel.rst b/docs/src/sklearn_api/ldaseqmodel.rst deleted file mode 100644 index f840c8ceec..0000000000 --- a/docs/src/sklearn_api/ldaseqmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.ldaseqmodel` -- Scikit learn wrapper for LdaSeq model -======================================================================= - -.. automodule:: gensim.sklearn_api.ldaseqmodel - :synopsis: Scikit learn wrapper for LdaSeq model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/lsimodel.rst b/docs/src/sklearn_api/lsimodel.rst deleted file mode 100644 index 9b2142a166..0000000000 --- a/docs/src/sklearn_api/lsimodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.lsimodel` -- Scikit learn wrapper for Latent Semantic Indexing -================================================================================ - -.. automodule:: gensim.sklearn_api.lsimodel - :synopsis: Scikit learn wrapper for LdaSeq model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/phrases.rst b/docs/src/sklearn_api/phrases.rst deleted file mode 100644 index c48326a487..0000000000 --- a/docs/src/sklearn_api/phrases.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.phrases` -- Scikit learn wrapper for phrase (collocation) detection -===================================================================================== - -.. automodule:: gensim.sklearn_api.phrases - :synopsis: Scikit learn wrapper for phrase (collocation) detection - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/rpmodel.rst b/docs/src/sklearn_api/rpmodel.rst deleted file mode 100644 index 47c0f41a49..0000000000 --- a/docs/src/sklearn_api/rpmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.rpmodel` -- Scikit learn wrapper for Random Projection model -============================================================================== - -.. automodule:: gensim.sklearn_api.rpmodel - :synopsis: Scikit learn wrapper for Random Projection model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/text2bow.rst b/docs/src/sklearn_api/text2bow.rst deleted file mode 100644 index 80148c787b..0000000000 --- a/docs/src/sklearn_api/text2bow.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.text2bow` -- Scikit learn wrapper word<->id mapping -===================================================================================== - -.. automodule:: gensim.sklearn_api.text2bow - :synopsis: Scikit learn wrapper word<->id mapping - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/tfidf.rst b/docs/src/sklearn_api/tfidf.rst deleted file mode 100644 index eab16f4c6d..0000000000 --- a/docs/src/sklearn_api/tfidf.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.tfidf` -- Scikit learn wrapper for TF-IDF model -========================================================================== - -.. automodule:: gensim.sklearn_api.tfidf - :synopsis: Scikit learn wrapper for TF-IDF model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/sklearn_api/w2vmodel.rst b/docs/src/sklearn_api/w2vmodel.rst deleted file mode 100644 index cca5d078e0..0000000000 --- a/docs/src/sklearn_api/w2vmodel.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`sklearn_api.w2vmodel` -- Scikit learn wrapper for word2vec model -====================================================================== - -.. automodule:: gensim.sklearn_api.w2vmodel - :synopsis: Scikit learn wrapper for word2vec model - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/bm25.rst b/docs/src/summarization/bm25.rst deleted file mode 100644 index 2889788ee4..0000000000 --- a/docs/src/summarization/bm25.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`summarization.bm25` -- BM25 ranking function -========================================================= - -.. automodule:: gensim.summarization.bm25 - :synopsis: BM25 ranking function - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/commons.rst b/docs/src/summarization/commons.rst deleted file mode 100644 index 7e859c8937..0000000000 --- a/docs/src/summarization/commons.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`summarization.commons` -- Common graph functions -========================================================= - -.. automodule:: gensim.summarization.commons - :synopsis: Common graph functions - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/graph.rst b/docs/src/summarization/graph.rst deleted file mode 100644 index 909b15cf5e..0000000000 --- a/docs/src/summarization/graph.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`summarization.graph` -- TextRank graph -========================================================= - -.. automodule:: gensim.summarization.graph - :synopsis: TextRank graph - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/keywords.rst b/docs/src/summarization/keywords.rst deleted file mode 100644 index 041c5dd10b..0000000000 --- a/docs/src/summarization/keywords.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`summarization.keywords` -- Keywords for TextRank summarization algorithm -============================================================================== - -.. automodule:: gensim.summarization.keywords - :synopsis: Keywords for TextRank summarization algorithm - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/pagerank_weighted.rst b/docs/src/summarization/pagerank_weighted.rst deleted file mode 100644 index 0dd9638679..0000000000 --- a/docs/src/summarization/pagerank_weighted.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`summarization.pagerank_weighted` -- Weighted PageRank algorithm -===================================================================== - -.. automodule:: gensim.summarization.pagerank_weighted - :synopsis: Weighted PageRank algorithm - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/summariser.rst b/docs/src/summarization/summariser.rst deleted file mode 100644 index 42d2967453..0000000000 --- a/docs/src/summarization/summariser.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`summarization.summarizer` -- TextRank Summariser -========================================================= - -.. automodule:: gensim.summarization.summarizer - :synopsis: TextRank Summariser - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/syntactic_unit.rst b/docs/src/summarization/syntactic_unit.rst deleted file mode 100644 index 5e20ec5a3e..0000000000 --- a/docs/src/summarization/syntactic_unit.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`summarization.syntactic_unit` -- Syntactic Unit class -=========================================================== - -.. automodule:: gensim.summarization.syntactic_unit - :synopsis: Syntactic Unit class - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/summarization/textcleaner.rst b/docs/src/summarization/textcleaner.rst deleted file mode 100644 index 72eda3d779..0000000000 --- a/docs/src/summarization/textcleaner.rst +++ /dev/null @@ -1,10 +0,0 @@ -:mod:`summarization.textcleaner` -- Summarization pre-processing -================================================================ - -.. automodule:: gensim.summarization.textcleaner - :synopsis: Summarization pre-processing - :members: - :inherited-members: - :undoc-members: - :show-inheritance: - diff --git a/docs/src/topic_coherence/aggregation.rst b/docs/src/topic_coherence/aggregation.rst deleted file mode 100644 index e8330a838f..0000000000 --- a/docs/src/topic_coherence/aggregation.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`topic_coherence.aggregation` -- Aggregation module -======================================================== - -.. automodule:: gensim.topic_coherence.aggregation - :synopsis: Aggregation module - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/topic_coherence/direct_confirmation_measure.rst b/docs/src/topic_coherence/direct_confirmation_measure.rst deleted file mode 100644 index ad866f1eb0..0000000000 --- a/docs/src/topic_coherence/direct_confirmation_measure.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`topic_coherence.direct_confirmation_measure` -- Direct confirmation measure module -======================================================================================== - -.. automodule:: gensim.topic_coherence.direct_confirmation_measure - :synopsis: Direct confirmation measure module - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/topic_coherence/indirect_confirmation_measure.rst b/docs/src/topic_coherence/indirect_confirmation_measure.rst deleted file mode 100644 index 8bac1585b1..0000000000 --- a/docs/src/topic_coherence/indirect_confirmation_measure.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`topic_coherence.indirect_confirmation_measure` -- Indirect confirmation measure module -============================================================================================ - -.. automodule:: gensim.topic_coherence.indirect_confirmation_measure - :synopsis: Indirect confirmation measure module - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/topic_coherence/probability_estimation.rst b/docs/src/topic_coherence/probability_estimation.rst deleted file mode 100644 index 2f81571a62..0000000000 --- a/docs/src/topic_coherence/probability_estimation.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`topic_coherence.probability_estimation` -- Probability estimation module -============================================================================== - -.. automodule:: gensim.topic_coherence.probability_estimation - :synopsis: Probability estimation module - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/topic_coherence/segmentation.rst b/docs/src/topic_coherence/segmentation.rst deleted file mode 100644 index 883bf18c82..0000000000 --- a/docs/src/topic_coherence/segmentation.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`topic_coherence.segmentation` -- Segmentation module -========================================================== - -.. automodule:: gensim.topic_coherence.segmentation - :synopsis: Segmentation module - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/topic_coherence/text_analysis.rst b/docs/src/topic_coherence/text_analysis.rst deleted file mode 100644 index f4e3f7254e..0000000000 --- a/docs/src/topic_coherence/text_analysis.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`topic_coherence.text_analysis` -- Analyzing the texts of a corpus to accumulate statistical information about word occurrences -==================================================================================================================================== - -.. automodule:: gensim.topic_coherence.text_analysis - :synopsis: Analyzing the texts of a corpus to accumulate statistical information about word occurrences - :members: - :inherited-members: - :undoc-members: - :show-inheritance: From b7e882c804fe04a2994c481ee34dbd202a1396f5 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Thu, 21 Dec 2017 02:20:21 +0500 Subject: [PATCH 02/42] Walkaround reference bug --- CHANGELOG.md | 146 + CONTRIBUTING.md | 35 +- MANIFEST.in | 2 + README.md | 4 +- docker/Dockerfile | 4 + docs/notebooks/Poincare Evaluation.ipynb | 1733 +++ docs/notebooks/Poincare Tutorial.ipynb | 704 + docs/notebooks/doc2vec-IMDB.ipynb | 2 +- docs/notebooks/poincare/entailment_eval.png | Bin 0 -> 132846 bytes docs/notebooks/poincare/entailment_paper.png | Bin 0 -> 32675 bytes docs/notebooks/poincare/example_tree.png | Bin 0 -> 20777 bytes .../poincare/link_prediction_eval.png | Bin 0 -> 202645 bytes .../poincare/link_prediction_paper.png | Bin 0 -> 172214 bytes .../poincare/poincare_burn_in_eps.patch | 197 + docs/notebooks/poincare/poincare_numpy.patch | 324 + .../poincare/reconstruction_eval.png | Bin 0 -> 201202 bytes .../poincare/reconstruction_paper.png | Bin 0 -> 93664 bytes docs/notebooks/summarization_tutorial.ipynb | 948 +- docs/notebooks/word2vec.ipynb | 103 +- docs/src/apiref.rst | 21 + docs/src/conf.py | 4 +- gensim/__init__.py | 2 +- gensim/models/__init__.py | 1 + gensim/models/doc2vec.py | 12 +- gensim/models/doc2vec_inner.c | 912 +- gensim/models/fasttext.py | 555 +- gensim/models/fasttext_inner.c | 12680 ++++++++++++++++ gensim/models/fasttext_inner.pyx | 546 + gensim/models/hdpmodel.py | 11 +- gensim/models/keyedvectors.py | 382 +- gensim/models/ldamodel.py | 52 +- gensim/models/phrases.py | 91 +- gensim/models/poincare.py | 1602 ++ gensim/models/word2vec.py | 23 +- gensim/models/word2vec_inner.c | 1160 +- gensim/models/wrappers/dtmmodel.py | 10 +- gensim/models/wrappers/fasttext.py | 20 + gensim/models/wrappers/ldamallet.py | 6 +- gensim/parsing/preprocessing.py | 2 +- gensim/scripts/segment_wiki.py | 7 +- gensim/summarization/__init__.py | 1 + gensim/summarization/bm25.py | 115 +- gensim/summarization/commons.py | 44 + gensim/summarization/graph.py | 388 +- gensim/summarization/keywords.py | 352 +- gensim/summarization/mz_entropy.py | 119 + gensim/summarization/pagerank_weighted.py | 108 +- gensim/summarization/summarizer.py | 284 +- gensim/summarization/syntactic_unit.py | 35 +- gensim/summarization/textcleaner.py | 216 +- gensim/test/test_data/poincare_cp852.tsv | 2 + gensim/test/test_data/poincare_hypernyms.tsv | 5 + .../test_data/poincare_hypernyms_large.tsv | 95 + gensim/test/test_data/poincare_utf8.tsv | 2 + gensim/test/test_fasttext.py | 29 + gensim/test/test_keyedvectors.py | 127 + gensim/test/test_phrases.py | 146 +- gensim/test/test_poincare.py | 365 + gensim/test/test_summarization.py | 21 +- gensim/test/utils.py | 18 + gensim/utils.py | 46 +- gensim/viz/__init__.py | 3 + gensim/viz/poincare.py | 186 + setup.cfg | 8 +- setup.py | 10 +- tox.ini | 17 +- 66 files changed, 23499 insertions(+), 1544 deletions(-) create mode 100644 docs/notebooks/Poincare Evaluation.ipynb create mode 100644 docs/notebooks/Poincare Tutorial.ipynb create mode 100644 docs/notebooks/poincare/entailment_eval.png create mode 100644 docs/notebooks/poincare/entailment_paper.png create mode 100644 docs/notebooks/poincare/example_tree.png create mode 100644 docs/notebooks/poincare/link_prediction_eval.png create mode 100644 docs/notebooks/poincare/link_prediction_paper.png create mode 100644 docs/notebooks/poincare/poincare_burn_in_eps.patch create mode 100644 docs/notebooks/poincare/poincare_numpy.patch create mode 100644 docs/notebooks/poincare/reconstruction_eval.png create mode 100644 docs/notebooks/poincare/reconstruction_paper.png create mode 100644 gensim/models/fasttext_inner.c create mode 100644 gensim/models/fasttext_inner.pyx create mode 100644 gensim/models/poincare.py create mode 100644 gensim/summarization/mz_entropy.py create mode 100644 gensim/test/test_data/poincare_cp852.tsv create mode 100644 gensim/test/test_data/poincare_hypernyms.tsv create mode 100644 gensim/test/test_data/poincare_hypernyms_large.tsv create mode 100644 gensim/test/test_data/poincare_utf8.tsv create mode 100644 gensim/test/test_keyedvectors.py create mode 100644 gensim/test/test_poincare.py create mode 100644 gensim/viz/__init__.py create mode 100644 gensim/viz/poincare.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ad5dbf3f0..e19a2f3944 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,151 @@ Changes =========== +## 3.2.0, 2017-12-09 + +:star2: New features: + +* New download API for corpora and pre-trained models (__[@chaitaliSaini](https://github.com/chaitaliSaini)__ & __[@menshikh-iv](https://github.com/menshikh-iv)__, [#1705](https://github.com/RaRe-Technologies/gensim/pull/1705) & [#1632](https://github.com/RaRe-Technologies/gensim/pull/1632) & [#1492](https://github.com/RaRe-Technologies/gensim/pull/1492)) + - Download large NLP datasets in one line of Python, then use with memory-efficient data streaming: + ```python + import gensim.downloader as api + + for article in api.load("wiki-english-20171001"): + pass + + ``` + - Don’t waste time searching for good word embeddings, use the curated ones we included: + ```python + import gensim.downloader as api + + model = api.load("glove-twitter-25") + model.most_similar("engineer") + + # [('specialist', 0.957542896270752), + # ('developer', 0.9548177123069763), + # ('administrator', 0.9432312846183777), + # ('consultant', 0.93915855884552), + # ('technician', 0.9368376135826111), + # ('analyst', 0.9342101216316223), + # ('architect', 0.9257484674453735), + # ('engineering', 0.9159940481185913), + # ('systems', 0.9123805165290833), + # ('consulting', 0.9112802147865295)] + ``` + - [Blog post](https://rare-technologies.com/new-api-for-pretrained-nlp-models-and-datasets-in-gensim/) introducing the API and design decisions. + - [Notebook with examples](https://github.com/RaRe-Technologies/gensim/blob/be4500e4f0616ec2864c2ce70cb5d4db4b46512d/docs/notebooks/downloader_api_tutorial.ipynb) + +* New model: Poincaré embeddings (__[@jayantj](https://github.com/jayantj)__, [#1696](https://github.com/RaRe-Technologies/gensim/pull/1696) & [#1700](https://github.com/RaRe-Technologies/gensim/pull/1700) & [#1757](https://github.com/RaRe-Technologies/gensim/pull/1757) & [#1734](https://github.com/RaRe-Technologies/gensim/pull/1734)) + - Embed a graph (taxonomy) in the same way as word2vec embeds words: + ```python + from gensim.models.poincare import PoincareRelations, PoincareModel + from gensim.test.utils import datapath + + data = PoincareRelations(datapath('poincare_hypernyms.tsv')) + model = PoincareModel(data) + model.kv.most_similar("cat.n.01") + + # [('kangaroo.n.01', 0.010581353439700418), + # ('gib.n.02', 0.011171531439892076), + # ('striped_skunk.n.01', 0.012025106076442395), + # ('metatherian.n.01', 0.01246679759214648), + # ('mammal.n.01', 0.013281303506525968), + # ('marsupial.n.01', 0.013941330203709653)] + ``` + - [Tutorial notebook on Poincaré embeddings](https://github.com/RaRe-Technologies/gensim/blob/920c029ca97f961c8df264672c34936607876694/docs/notebooks/Poincare%20Tutorial.ipynb) + - [Model introduction and the journey of its implementation](https://rare-technologies.com/implementing-poincare-embeddings/) + - [Original paper](https://arxiv.org/abs/1705.08039) on arXiv + +* Optimized FastText (__[@manneshiva](https://github.com/manneshiva)__, [#1742](https://github.com/RaRe-Technologies/gensim/pull/1742)) + - New fast multithreaded implementation of FastText, natively in Python/Cython. Deprecates the existing wrapper for Facebook’s C++ implementation. + ```python + import gensim.downloader as api + from gensim.models import FastText + + model = FastText(api.load("text8")) + model.most_similar("cat") + + # [('catnip', 0.8538144826889038), + # ('catwalk', 0.8136177062988281), + # ('catchy', 0.7828493118286133), + # ('caf', 0.7826495170593262), + # ('bobcat', 0.7745151519775391), + # ('tomcat', 0.7732658386230469), + # ('moat', 0.7728310823440552), + # ('caye', 0.7666271328926086), + # ('catv', 0.7651021480560303), + # ('caveat', 0.7643581628799438)] + + + ``` + +* Binary pre-compiled wheels for Windows, OSX and Linux (__[@menshikh-iv](https://github.com/menshikh-iv)__, [MacPython/gensim-wheels/#7](https://github.com/MacPython/gensim-wheels/pull/7)) + - Users no longer need to have a C compiler for using the fast (Cythonized) version of word2vec, doc2vec, etc. + - Faster Gensim pip installation + +* Added `DeprecationWarnings` to deprecated methods and parameters, with a clear schedule for removal. + +:+1: Improvements: +* Add Montemurro and Zanette's entropy based keyword extraction algorithm. Fix #665 (__[@PeteBleackley](https://github.com/PeteBleackley)__, [#1738](https://github.com/RaRe-Technologies/gensim/pull/1738)) +* Fix flake8 E731, E402, refactor tests & sklearn API code. Partial fix #1644 (__[@horpto](https://github.com/horpto)__, [#1689](https://github.com/RaRe-Technologies/gensim/pull/1689)) +* Reduce distribution size. Fix #1698 (__[@menshikh-iv](https://github.com/menshikh-iv)__, [#1699](https://github.com/RaRe-Technologies/gensim/pull/1699)) +* Improve `scan_vocab` speed, `build_vocab_from_freq` method (__[@jodevak](https://github.com/jodevak)__, [#1695](https://github.com/RaRe-Technologies/gensim/pull/1695)) +* Improve `segment_wiki` script (__[@piskvorky](https://github.com/piskvorky)__, [#1707](https://github.com/RaRe-Technologies/gensim/pull/1707)) +* Add custom `dtype` support for `LdaModel`. Partially fix #1576 (__[@xelez](https://github.com/xelez)__, [#1656](https://github.com/RaRe-Technologies/gensim/pull/1656)) +* Add `doc2idx` method for `gensim.corpora.Dictionary`. Fix #1634 (__[@roopalgarg](https://github.com/roopalgarg)__, [#1720](https://github.com/RaRe-Technologies/gensim/pull/1720)) +* Add tox and pytest to gensim, integration with Travis and Appveyor. Fix #1613, #1644 (__[@menshikh-iv](https://github.com/menshikh-iv)__, [#1721](https://github.com/RaRe-Technologies/gensim/pull/1721)) +* Add flag for hiding outdated data for `gensim.downloader.info` (__[@menshikh-iv](https://github.com/menshikh-iv)__, [#1736](https://github.com/RaRe-Technologies/gensim/pull/1736)) +* Add reproducible order between python versions for `gensim.corpora.Dictionary` (__[@formi23](https://github.com/formi23)__, [#1715](https://github.com/RaRe-Technologies/gensim/pull/1715)) +* Update `tox.ini`, `setup.cfg`, `README.md` (__[@menshikh-iv](https://github.com/menshikh-iv)__, [#1741](https://github.com/RaRe-Technologies/gensim/pull/1741)) +* Add custom `logsumexp` for `LdaModel` (__[@arlenk](https://github.com/arlenk)__, [#1745](https://github.com/RaRe-Technologies/gensim/pull/1745)) + +:red_circle: Bug fixes: +* Fix ranking formula in `gensim.summarization.bm25`. Fix #1718 (__[@souravsingh](https://github.com/souravsingh)__, [#1726](https://github.com/RaRe-Technologies/gensim/pull/1726)) +* Fixed incompatibility in persistence for `FastText` wrapper. Fix #1642 (__[@chinmayapancholi13](https://github.com/chinmayapancholi13)__, [#1723](https://github.com/RaRe-Technologies/gensim/pull/1723)) +* Fix `gensim.sklearn_api` bug with `documents_columns` parameter. Fix #1676 (__[@chinmayapancholi13](https://github.com/chinmayapancholi13)__, [#1704](https://github.com/RaRe-Technologies/gensim/pull/1704)) +* Fix slowdown of CI, remove pytest-cov (__[@menshikh-iv](https://github.com/menshikh-iv)__, [#1728](https://github.com/RaRe-Technologies/gensim/pull/1728)) +* Replace outdated packages in Dockerfile (__[@rbahumi](https://github.com/rbahumi)__, [#1730](https://github.com/RaRe-Technologies/gensim/pull/1730)) +* Replace `num_words` to `topn` in `LdaMallet.show_topics`. Fix #1747 (__[@apoorvaeternity](https://github.com/apoorvaeternity)__, [#1749](https://github.com/RaRe-Technologies/gensim/pull/1749)) +* Fix `os.rename` from `gensim.downloader` when 'src' and 'dst' on different partitions (__[@anotherbugmaster](https://github.com/anotherbugmaster)__, [#1733](https://github.com/RaRe-Technologies/gensim/pull/1733)) +* Fix `DeprecationWarning` from `logsumexp` (__[@dreamgonfly](https://github.com/dreamgonfly)__, [#1703](https://github.com/RaRe-Technologies/gensim/pull/1703)) +* Fix backward compatibility problem in `Phrases.load`. Fix #1751 (__[@alexgarel](https://github.com/alexgarel)__, [#1758](https://github.com/RaRe-Technologies/gensim/pull/1758)) +* Fix `load_word2vec_format` from `FastText`. Fix #1743 (__[@manneshiva](https://github.com/manneshiva)__, [#1755](https://github.com/RaRe-Technologies/gensim/pull/1755)) +* Fix ipython kernel version in `Dockerfile`. Fix #1762 (__[@rbahumi](https://github.com/rbahumi)__, [#1764](https://github.com/RaRe-Technologies/gensim/pull/1764)) +* Fix writing in `segment_wiki` (__[@horpto](https://github.com/horpto)__, [#1763](https://github.com/RaRe-Technologies/gensim/pull/1763)) +* Fix write method of file requires byte-like object in `segment_wiki` (__[@horpto](https://github.com/horpto)__, [#1750](https://github.com/RaRe-Technologies/gensim/pull/1750)) +* Fix incorrect vectors learned during online training for `FastText`. Fix #1752 (__[@manneshiva](https://github.com/manneshiva)__, [#1756](https://github.com/RaRe-Technologies/gensim/pull/1756)) +* Fix `dtype` of `model.wv.syn0_vocab` on updating `vocab` for `FastText`. Fix #1759 (__[@manneshiva](https://github.com/manneshiva)__, [#1760](https://github.com/RaRe-Technologies/gensim/pull/1760)) +* Fix hashing-trick from `FastText.build_vocab`. Fix #1765 (__[@manneshiva](https://github.com/manneshiva)__, [#1768](https://github.com/RaRe-Technologies/gensim/pull/1768)) +* Add explicit `DeprecationWarning` for all outdated stuff. Fix #1753 (__[@menshikh-iv](https://github.com/menshikh-iv)__, [#1769](https://github.com/RaRe-Technologies/gensim/pull/1769)) +* Fix epsilon according to `dtype` in `LdaModel` (__[@menshikh-iv](https://github.com/menshikh-iv)__, [#1770](https://github.com/RaRe-Technologies/gensim/pull/1770)) + +:books: Tutorial and doc improvements: +* Update perf numbers of `segment_wiki` (__[@piskvorky](https://github.com/piskvorky)__, [#1708](https://github.com/RaRe-Technologies/gensim/pull/1708)) +* Update docstring for `gensim.summarization.summarize`. Fix #1575 (__[@fbarrios](https://github.com/fbarrios)__, [#1702](https://github.com/RaRe-Technologies/gensim/pull/1702)) +* Refactor API Reference for `gensim.parsing`. Fix #1664 (__[@CLearERR](https://github.com/CLearERR)__, [#1684](https://github.com/RaRe-Technologies/gensim/pull/1684)) +* Fix typos in doc2vec-wikipedia notebook (__[@youqad](https://github.com/youqad)__, [#1727](https://github.com/RaRe-Technologies/gensim/pull/1727)) +* Fix PyPI long description rendering (__[@edigaryev](https://github.com/edigaryev)__, [#1739](https://github.com/RaRe-Technologies/gensim/pull/1739)) +* Fix twitter badge src (__[@menshikh-iv](https://github.com/menshikh-iv)__) +* Fix maillist badge color (__[@menshikh-iv](https://github.com/menshikh-iv)__) + +:warning: Deprecations (will be removed in the next major release) +* Remove + - `gensim.examples` + - `gensim.nosy` + - `gensim.scripts.word2vec_standalone` + - `gensim.scripts.make_wiki_lemma` + - `gensim.scripts.make_wiki_online` + - `gensim.scripts.make_wiki_online_lemma` + - `gensim.scripts.make_wiki_online_nodebug` + - `gensim.scripts.make_wiki` + +* Move + - `gensim.scripts.make_wikicorpus` ➡ `gensim.scripts.make_wiki.py` + - `gensim.summarization` ➡ `gensim.models.summarization` + - `gensim.topic_coherence` ➡ `gensim.models._coherence` + - `gensim.utils` ➡ `gensim.utils.utils` (old imports will continue to work) + - `gensim.parsing.*` ➡ `gensim.utils.text_utils` + + ## 3.1.0, 2017-11-06 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dd8f49ed4b..a5db9ae27e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,34 @@ -Please see [contribution-guide.org](http://www.contribution-guide.org/) for steps we expect from contributors before submitting an issue or bug report. Be as concrete as possible, include relevant logs, package versions etc. +# How to submit an issue? -Please check the [Gensim FAQ](https://github.com/RaRe-Technologies/gensim/wiki/Recipes-&-FAQ) page before posting. +First, please see [contribution-guide.org](http://www.contribution-guide.org/) for the steps we expect from contributors before submitting an issue or bug report. Be as concrete as possible, include relevant logs, package versions etc. -**The proper place for open-ended questions is the [gensim mailing list](https://groups.google.com/forum/#!forum/gensim).** Github is not the right place for research discussions or feature requests. +Also, please check the [Gensim FAQ](https://github.com/RaRe-Technologies/gensim/wiki/Recipes-&-FAQ) page before posting. -For developers: see our [Developer Page](https://github.com/piskvorky/gensim/wiki/Developer-page#code-style) for details on code style, testing and similar. +**The proper place for open-ended questions is the [Gensim mailing list](https://groups.google.com/forum/#!forum/gensim).** Github is not the right place for research discussions or feature requests. -Thanks! +# How to add a new feature or create a pull request? + +1. Fork the Gensim repository +2. Clone your fork: `git clone https://github.com//gensim.git` +3. Create a new branch based on `develop`: `git checkout -b my-feature develop` +4. Setup your Python enviroment + - Create a new [virtual environment](https://virtualenv.pypa.io/en/stable/): `pip install virtualenv; virtualenv gensim_env; source gensim_env/bin/activate` + - Install Gensim and its test dependencies in [editable mode](https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs): + - For linux: `pip install -e .[test]` + - For windows: `pip install -e .[test-win]` +5. Implement your changes +6. Check that everything's OK in your branch: + - Check it for PEP8: `tox -e flake8` + - Build its documentation (works only for MacOS/Linux): `tox -e docs` (documentation stored in `docs/src/_build`) + - Run unit tests: `tox -e py{version}-{os}`, for example `tox -e py27-linux` or `tox -e py36-win` where + - `{version}` is one of `27`, `35`, `36` + - `{os}` is either `win` or `linux` +7. Add files, commit and push: `git add ... ; git commit -m "my commit message"; git push origin my-feature` +8. [Create a PR](https://help.github.com/articles/creating-a-pull-request/) on Github. Write a **clear description** for your PR, including all the context and relevant information, such as: + - The issue that you fixed, e.g. `Fixes #123` + - Motivation: why did you create this PR? What functionality did you set out to improve? What was the problem + an overview of how you fixed it? Whom does it affect and how should people use it? + - Any other useful information: links to other related Github or mailing list issues and discussions, benchmark graphs, academic papers… + +P.S. for developers: see our [Developer Page](https://github.com/piskvorky/gensim/wiki/Developer-page#code-style) for details on the Gensim code style, CI, testing and similar. + +**Thanks and let's improve the open source world together!** diff --git a/MANIFEST.in b/MANIFEST.in index d7be1e386e..b6f66a9195 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -10,3 +10,5 @@ include gensim/models/word2vec_inner.pyx include gensim/models/word2vec_inner.pxd include gensim/models/doc2vec_inner.c include gensim/models/doc2vec_inner.pyx +include gensim/models/fasttext_inner.c +include gensim/models/fasttext_inner.pyx diff --git a/README.md b/README.md index e5c549a1d6..701d20f302 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ gensim – Topic Modelling in Python [![GitHub release](https://img.shields.io/github/release/rare-technologies/gensim.svg?maxAge=3600)](https://github.com/RaRe-Technologies/gensim/releases) [![Wheel](https://img.shields.io/pypi/wheel/gensim.svg)](https://pypi.python.org/pypi/gensim) [![DOI](https://zenodo.org/badge/DOI/10.13140/2.1.2393.1847.svg)](https://doi.org/10.13140/2.1.2393.1847) -[![Mailing List](https://img.shields.io/badge/-Mailing%20List-lightgrey.svg)](https://groups.google.com/forum/#!forum/gensim) +[![Mailing List](https://img.shields.io/badge/-Mailing%20List-brightgreen.svg)](https://groups.google.com/forum/#!forum/gensim) [![Gitter](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-09a3d5.svg)](https://gitter.im/RaRe-Technologies/gensim) -[![Follow](https://img.shields.io/twitter/follow/spacy_io.svg?style=social&label=Follow)](https://twitter.com/gensim_py) +[![Follow](https://img.shields.io/twitter/follow/gensim_py.svg?style=social&label=Follow)](https://twitter.com/gensim_py) diff --git a/docker/Dockerfile b/docker/Dockerfile index 328faf2dc0..73dd855a12 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -151,6 +151,10 @@ RUN cd /gensim/gensim_dependencies \ # Start gensim +# Fix ipython kernel version +RUN ipython2 kernel install +RUN ipython3 kernel install + # Run check script RUN python2 /gensim/docker/check_fast_version.py RUN python3 /gensim/docker/check_fast_version.py diff --git a/docs/notebooks/Poincare Evaluation.ipynb b/docs/notebooks/Poincare Evaluation.ipynb new file mode 100644 index 0000000000..72ccf4e01d --- /dev/null +++ b/docs/notebooks/Poincare Evaluation.ipynb @@ -0,0 +1,1733 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Evaluation of Poincare Embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook demonstrates how well Poincare embeddings perform on the tasks detailed in the [original paper](https://arxiv.org/pdf/1705.08039.pdf) about the embeddings.\n", + "\n", + "The following two external, open-source implementations are used - \n", + "1. [C++](https://github.com/TatsuyaShirakawa/poincare-embedding)\n", + "2. [Numpy](https://github.com/nishnik/poincare_embeddings)\n", + "\n", + "This is the list of tasks - \n", + "1. WordNet reconstruction\n", + "2. WordNet link prediction\n", + "3. Link prediction in collaboration networks (evaluation incomplete)\n", + "4. Lexical entailment on HyperLex\n", + "\n", + "A more detailed explanation of the tasks and the evaluation methodology is present in the individual evaluation subsections." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Setup\n", + "\n", + "The following section performs the following - \n", + "1. Imports required python libraries and downloads the wordnet data\n", + "2. Clones the repositories containing the C++ and Numpy implementations of the Poincare embeddings\n", + "3. Applies patches containing minor changes to the implementations.\n", + "4. Compiles the C++ sources to create a binary" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/jayant/Projects/gensim/gensim\n" + ] + } + ], + "source": [ + "% cd ../.." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Some libraries need to be installed that are not part of Gensim\n", + "! pip install click>=6.7 nltk>=3.2.5 prettytable>=0.7.2 pygtrie>=2.2" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package wordnet to /home/jayant/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import csv\n", + "from collections import OrderedDict\n", + "from IPython.display import display, HTML\n", + "import logging\n", + "import os\n", + "import pickle\n", + "import random\n", + "import re\n", + "\n", + "import click\n", + "from gensim.models.poincare import PoincareModel, PoincareRelations, \\\n", + " ReconstructionEvaluation, LinkPredictionEvaluation, \\\n", + " LexicalEntailmentEvaluation, PoincareKeyedVectors\n", + "from gensim.utils import check_output\n", + "import nltk\n", + "from prettytable import PrettyTable\n", + "from smart_open import smart_open\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "nltk.download('wordnet')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please set the variable `parent_directory` below to change the directory to which the repositories are cloned." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/jayant/Projects/gensim/gensim/docs/notebooks\n" + ] + } + ], + "source": [ + "% cd docs/notebooks/" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "current_directory = os.getcwd()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Change this variable to `False` to not remove and re-download repos for external implementations\n", + "force_setup = False\n", + "\n", + "# The poincare datasets, models and source code for external models are downloaded to this directory\n", + "parent_directory = os.path.join(current_directory, 'poincare')\n", + "! mkdir -p {parent_directory}" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/jayant/Projects/gensim/gensim/docs/notebooks/poincare\n" + ] + } + ], + "source": [ + "% cd {parent_directory}\n", + "\n", + "# Clone repos\n", + "np_repo_name = 'poincare-np-embedding'\n", + "if force_setup and os.path.exists(np_repo_name):\n", + " ! rm -rf {np_repo_name}\n", + "clone_np_repo = not os.path.exists(np_repo_name)\n", + "if clone_np_repo:\n", + " ! git clone https://github.com/nishnik/poincare_embeddings.git {np_repo_name}\n", + "\n", + "cpp_repo_name = 'poincare-cpp-embedding'\n", + "if force_setup and os.path.exists(cpp_repo_name):\n", + " ! rm -rf {cpp_repo_name}\n", + "clone_cpp_repo = not os.path.exists(cpp_repo_name)\n", + "if clone_cpp_repo:\n", + " ! git clone https://github.com/TatsuyaShirakawa/poincare-embedding.git {cpp_repo_name}\n", + "\n", + "patches_applied = False" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Apply patches\n", + "if clone_cpp_repo and not patches_applied:\n", + " % cd {cpp_repo_name}\n", + " ! git apply ../poincare_burn_in_eps.patch\n", + "\n", + "if clone_np_repo and not patches_applied:\n", + " % cd ../{np_repo_name}\n", + " ! git apply ../poincare_numpy.patch\n", + " \n", + "patches_applied = True" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/jayant/projects/gensim/docs/notebooks/poincare/poincare-cpp-embedding\n", + "/home/jayant/projects/gensim/docs/notebooks/poincare/poincare-cpp-embedding/work\n", + "-- Configuring done\n", + "-- Generating done\n", + "-- Build files have been written to: /home/jayant/projects/gensim/docs/notebooks/poincare/poincare-cpp-embedding/work\n", + "[100%] Built target poincare_embedding\n", + "/home/jayant/projects/gensim/docs/notebooks\n" + ] + } + ], + "source": [ + "# Compile the code for the external c++ implementation into a binary\n", + "% cd {parent_directory}/{cpp_repo_name}\n", + "! mkdir -p work\n", + "% cd work\n", + "! cmake ..\n", + "! make\n", + "% cd {current_directory}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You might need to install an updated version of `cmake` to be able to compile the source code. Please make sure that the binary `poincare_embedding` has been created before proceeding by verifying the above cell does not raise an error." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "cpp_binary_path = os.path.join(parent_directory, cpp_repo_name, 'work', 'poincare_embedding')\n", + "assert(os.path.exists(cpp_binary_path)), 'Binary file doesnt exist at %s' % cpp_binary_path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Training\n", + "\n", + "### 2.1 Create the data" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# These directories are auto created in the current directory for storing poincare datasets and models\n", + "data_directory = os.path.join(parent_directory, 'data')\n", + "models_directory = os.path.join(parent_directory, 'models')\n", + "\n", + "# Create directories\n", + "! mkdir -p {data_directory}\n", + "! mkdir -p {models_directory}" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Prepare the WordNet data\n", + "wordnet_file = os.path.join(data_directory, 'wordnet_noun_hypernyms.tsv')\n", + "if not os.path.exists(wordnet_file):\n", + " ! python {parent_directory}/{cpp_repo_name}/scripts/create_wordnet_noun_hierarchy.py {wordnet_file}" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2017-11-14 11:15:54-- http://people.ds.cam.ac.uk/iv250/paper/hyperlex/hyperlex-data.zip\n", + "Resolving people.ds.cam.ac.uk (people.ds.cam.ac.uk)... 131.111.3.47\n", + "Connecting to people.ds.cam.ac.uk (people.ds.cam.ac.uk)|131.111.3.47|:80... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 183900 (180K) [application/zip]\n", + "Saving to: ‘/home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex-data.zip’\n", + "\n", + "/home/jayant/projec 100%[===================>] 179.59K --.-KB/s in 0.06s \n", + "\n", + "2017-11-14 11:15:54 (2.94 MB/s) - ‘/home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex-data.zip’ saved [183900/183900]\n", + "\n", + "Archive: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex-data.zip\n", + " creating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/nouns-verbs/\n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/nouns-verbs/hyperlex-verbs.txt \n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/nouns-verbs/hyperlex-nouns.txt \n", + " creating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/\n", + " creating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/random/\n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/random/hyperlex_training_all_random.txt \n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/random/hyperlex_test_all_random.txt \n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/random/hyperlex_dev_all_random.txt \n", + " creating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/lexical/\n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/lexical/hyperlex_dev_all_lexical.txt \n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/lexical/hyperlex_test_all_lexical.txt \n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/splits/lexical/hyperlex_training_all_lexical.txt \n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/hyperlex-all.txt \n", + " inflating: /home/jayant/projects/gensim/docs/notebooks/poincare/data/hyperlex/README.txt \n" + ] + } + ], + "source": [ + "# Prepare the HyperLex data\n", + "hyperlex_url = \"http://people.ds.cam.ac.uk/iv250/paper/hyperlex/hyperlex-data.zip\"\n", + "! wget {hyperlex_url} -O {data_directory}/hyperlex-data.zip\n", + "if os.path.exists(os.path.join(data_directory, 'hyperlex')):\n", + " ! rm -r {data_directory}/hyperlex\n", + "! unzip {data_directory}/hyperlex-data.zip -d {data_directory}/hyperlex/\n", + "hyperlex_file = os.path.join(data_directory, 'hyperlex', 'nouns-verbs', 'hyperlex-nouns.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2 Training [C++ embeddings](https://github.com/TatsuyaShirakawa/poincare-embedding)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def train_cpp_model(\n", + " binary_path, data_file, output_file, dim, epochs, neg,\n", + " num_threads, epsilon, burn_in, seed=0):\n", + " \"\"\"Train a poincare embedding using the c++ implementation\n", + " \n", + " Args:\n", + " binary_path (str): Path to the compiled c++ implementation binary\n", + " data_file (str): Path to tsv file containing relation pairs\n", + " output_file (str): Path to output file containing model\n", + " dim (int): Number of dimensions of the trained model\n", + " epochs (int): Number of epochs to use\n", + " neg (int): Number of negative samples to use\n", + " num_threads (int): Number of threads to use for training the model\n", + " epsilon (float): Constant used for clipping below a norm of one\n", + " burn_in (int): Number of epochs to use for burn-in init (0 means no burn-in)\n", + " \n", + " Notes: \n", + " If `output_file` already exists, skips training\n", + " \"\"\"\n", + " if os.path.exists(output_file):\n", + " print('File %s exists, skipping' % output_file)\n", + " return\n", + " args = {\n", + " 'dim': dim,\n", + " 'max_epoch': epochs,\n", + " 'neg_size': neg,\n", + " 'num_thread': num_threads,\n", + " 'epsilon': epsilon,\n", + " 'burn_in': burn_in,\n", + " 'learning_rate_init': 0.1,\n", + " 'learning_rate_final': 0.0001,\n", + " }\n", + " cmd = [binary_path, data_file, output_file]\n", + " for option, value in args.items():\n", + " cmd.append(\"--%s\" % option)\n", + " cmd.append(str(value))\n", + " \n", + " return check_output(args=cmd)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "model_sizes = [5, 10, 20, 50, 100, 200]\n", + "default_params = {\n", + " 'neg': 20,\n", + " 'epochs': 50,\n", + " 'threads': 8,\n", + " 'eps': 1e-6,\n", + " 'burn_in': 0,\n", + " 'batch_size': 10,\n", + " 'reg': 0.0\n", + "}\n", + "\n", + "non_default_params = {\n", + " 'neg': [10],\n", + " 'epochs': [200],\n", + " 'burn_in': [10]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "def cpp_model_name_from_params(params, prefix):\n", + " param_keys = ['burn_in', 'epochs', 'neg', 'eps', 'threads']\n", + " name = ['%s_%s' % (key, params[key]) for key in sorted(param_keys)]\n", + " return '%s_%s' % (prefix, '_'.join(name))\n", + "\n", + "def train_model_with_params(params, train_file, model_sizes, prefix, implementation):\n", + " \"\"\"Trains models with given params for multiple model sizes using the given implementation\n", + " \n", + " Args:\n", + " params (dict): parameters to train the model with\n", + " train_file (str): Path to tsv file containing relation pairs\n", + " model_sizes (list): list of dimension sizes (integer) to train the model with\n", + " prefix (str): prefix to use for the saved model filenames\n", + " implementation (str): whether to use the numpy or c++ implementation,\n", + " allowed values: 'numpy', 'c++'\n", + " \n", + " Returns:\n", + " tuple (model_name, model_files)\n", + " model_files is a dict of (size, filename) pairs\n", + " Example: ('cpp_model_epochs_50', {5: 'models/cpp_model_epochs_50_dim_5'})\n", + " \"\"\"\n", + " files = {}\n", + " if implementation == 'c++':\n", + " model_name = cpp_model_name_from_params(params, prefix)\n", + " elif implementation == 'numpy':\n", + " model_name = np_model_name_from_params(params, prefix)\n", + " elif implementation == 'gensim':\n", + " model_name = gensim_model_name_from_params(params, prefix)\n", + " else:\n", + " raise ValueError('Given implementation %s not found' % implementation)\n", + " for model_size in model_sizes:\n", + " output_file_name = '%s_dim_%d' % (model_name, model_size)\n", + " output_file = os.path.join(models_directory, output_file_name)\n", + " print('Training model %s of size %d' % (model_name, model_size))\n", + " if implementation == 'c++':\n", + " out = train_cpp_model(\n", + " cpp_binary_path, train_file, output_file, model_size,\n", + " params['epochs'], params['neg'], params['threads'],\n", + " params['eps'], params['burn_in'], seed=0)\n", + " elif implementation == 'numpy':\n", + " train_external_numpy_model(\n", + " python_script_path, train_file, output_file, model_size,\n", + " params['epochs'], params['neg'], seed=0)\n", + " elif implementation == 'gensim':\n", + " train_gensim_model(\n", + " train_file, output_file, model_size, params['epochs'],\n", + " params['neg'], params['burn_in'], params['batch_size'], params['reg'], seed=0)\n", + " else:\n", + " raise ValueError('Given implementation %s not found' % implementation)\n", + " files[model_size] = output_file\n", + " return (model_name, files)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "model_files = {}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "model_files['c++'] = {}\n", + "# Train c++ models with default params\n", + "model_name, files = train_model_with_params(default_params, wordnet_file, model_sizes, 'cpp_model', 'c++')\n", + "model_files['c++'][model_name] = {}\n", + "for dim, filepath in files.items():\n", + " model_files['c++'][model_name][dim] = filepath\n", + "# Train c++ models with non-default params\n", + "for param, values in non_default_params.items():\n", + " params = default_params.copy()\n", + " for value in values:\n", + " params[param] = value\n", + " model_name, files = train_model_with_params(params, wordnet_file, model_sizes, 'cpp_model', 'c++')\n", + " model_files['c++'][model_name] = {}\n", + " for dim, filepath in files.items():\n", + " model_files['c++'][model_name][dim] = filepath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.3 Training [numpy embeddings](https://github.com/nishnik/poincare_embeddings) (non-gensim)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "python_script_path = os.path.join(parent_directory, np_repo_name, 'poincare.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "def np_model_name_from_params(params, prefix):\n", + " param_keys = ['neg', 'epochs']\n", + " name = ['%s_%s' % (key, params[key]) for key in sorted(param_keys)]\n", + " return '%s_%s' % (prefix, '_'.join(name))\n", + "\n", + "def train_external_numpy_model(\n", + " script_path, data_file, output_file, dim, epochs, neg, seed=0):\n", + " \"\"\"Train a poincare embedding using an external numpy implementation\n", + " \n", + " Args:\n", + " script_path (str): Path to the Python training script\n", + " data_file (str): Path to tsv file containing relation pairs\n", + " output_file (str): Path to output file containing model\n", + " dim (int): Number of dimensions of the trained model\n", + " epochs (int): Number of epochs to use\n", + " neg (int): Number of negative samples to use\n", + " \n", + " Notes: \n", + " If `output_file` already exists, skips training\n", + " \"\"\"\n", + " if os.path.exists(output_file):\n", + " print('File %s exists, skipping' % output_file)\n", + " return\n", + " args = {\n", + " 'input-file': data_file,\n", + " 'output-file': output_file,\n", + " 'dimensions': dim,\n", + " 'epochs': epochs,\n", + " 'learning-rate': 0.01,\n", + " 'num-negative': neg,\n", + " }\n", + " cmd = ['python', script_path]\n", + " for option, value in args.items():\n", + " cmd.append(\"--%s\" % option)\n", + " cmd.append(str(value))\n", + " \n", + " return check_output(args=cmd)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_files['numpy'] = {}\n", + "# Train models with default params\n", + "model_name, files = train_model_with_params(default_params, wordnet_file, model_sizes, 'np_model', 'numpy')\n", + "model_files['numpy'][model_name] = {}\n", + "for dim, filepath in files.items():\n", + " model_files['numpy'][model_name][dim] = filepath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.4 Training gensim embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def gensim_model_name_from_params(params, prefix):\n", + " param_keys = ['neg', 'epochs', 'burn_in', 'batch_size', 'reg']\n", + " name = ['%s_%s' % (key, params[key]) for key in sorted(param_keys)]\n", + " return '%s_%s' % (prefix, '_'.join(name))\n", + "\n", + "def train_gensim_model(\n", + " data_file, output_file, dim, epochs, neg, burn_in, batch_size, reg, seed=0):\n", + " \"\"\"Train a poincare embedding using gensim implementation\n", + " \n", + " Args:\n", + " data_file (str): Path to tsv file containing relation pairs\n", + " output_file (str): Path to output file containing model\n", + " dim (int): Number of dimensions of the trained model\n", + " epochs (int): Number of epochs to use\n", + " neg (int): Number of negative samples to use\n", + " burn_in (int): Number of epochs to use for burn-in initialization\n", + " batch_size (int): Size of batch to use for training\n", + " reg (float): Coefficient used for l2-regularization while training\n", + " \n", + " Notes: \n", + " If `output_file` already exists, skips training\n", + " \"\"\"\n", + " if os.path.exists(output_file):\n", + " print('File %s exists, skipping' % output_file)\n", + " return\n", + " train_data = PoincareRelations(data_file)\n", + " model = PoincareModel(train_data, size=dim, negative=neg, burn_in=burn_in, regularization_coeff=reg)\n", + " model.train(epochs=epochs, batch_size=batch_size)\n", + " model.save(output_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "non_default_params_gensim = [\n", + " {'neg': 10,},\n", + " {'burn_in': 10,},\n", + " {'batch_size': 50,},\n", + " {'neg': 10, 'reg': 1, 'burn_in': 10, 'epochs': 200},\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_files['gensim'] = {}\n", + "# Train models with default params\n", + "model_name, files = train_model_with_params(default_params, wordnet_file, model_sizes, 'gensim_model', 'gensim')\n", + "model_files['gensim'][model_name] = {}\n", + "for dim, filepath in files.items():\n", + " model_files['gensim'][model_name][dim] = filepath\n", + "# Train models with non-default params\n", + "for new_params in non_default_params_gensim:\n", + " params = default_params.copy()\n", + " params.update(new_params)\n", + " model_name, files = train_model_with_params(params, wordnet_file, model_sizes, 'gensim_model', 'gensim')\n", + " model_files['gensim'][model_name] = {}\n", + " for dim, filepath in files.items():\n", + " model_files['gensim'][model_name][dim] = filepath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Loading the embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "def transform_cpp_embedding_to_kv(input_file, output_file, encoding='utf8'):\n", + " \"\"\"Given a C++ embedding tsv filepath, converts it to a KeyedVector-supported file\"\"\"\n", + " with smart_open(input_file, 'rb') as f:\n", + " lines = [line.decode(encoding) for line in f]\n", + " if not len(lines):\n", + " raise ValueError(\"file is empty\")\n", + " first_line = lines[0]\n", + " parts = first_line.rstrip().split(\"\\t\")\n", + " model_size = len(parts) - 1\n", + " vocab_size = len(lines)\n", + " with open(output_file, 'w') as f:\n", + " f.write('%d %d\\n' % (vocab_size, model_size))\n", + " for line in lines:\n", + " f.write(line.replace('\\t', ' '))\n", + "\n", + "def transform_numpy_embedding_to_kv(input_file, output_file, encoding='utf8'):\n", + " \"\"\"Given a numpy poincare embedding pkl filepath, converts it to a KeyedVector-supported file\"\"\"\n", + " np_embeddings = pickle.load(open(input_file, 'rb'))\n", + " random_embedding = np_embeddings[list(np_embeddings.keys())[0]]\n", + " \n", + " model_size = random_embedding.shape[0]\n", + " vocab_size = len(np_embeddings)\n", + " with open(output_file, 'w') as f:\n", + " f.write('%d %d\\n' % (vocab_size, model_size))\n", + " for key, vector in np_embeddings.items():\n", + " vector_string = ' '.join('%.6f' % value for value in vector)\n", + " f.write('%s %s\\n' % (key, vector_string))\n", + "\n", + "def load_poincare_cpp(input_filename):\n", + " \"\"\"Load embedding trained via C++ Poincare model.\n", + "\n", + " Parameters\n", + " ----------\n", + " filepath : str\n", + " Path to tsv file containing embedding.\n", + "\n", + " Returns\n", + " -------\n", + " PoincareKeyedVectors instance.\n", + "\n", + " \"\"\"\n", + " keyed_vectors_filename = input_filename + '.kv'\n", + " transform_cpp_embedding_to_kv(input_filename, keyed_vectors_filename)\n", + " embedding = PoincareKeyedVectors.load_word2vec_format(keyed_vectors_filename)\n", + " os.unlink(keyed_vectors_filename)\n", + " return embedding\n", + "\n", + "def load_poincare_numpy(input_filename):\n", + " \"\"\"Load embedding trained via Python numpy Poincare model.\n", + "\n", + " Parameters\n", + " ----------\n", + " filepath : str\n", + " Path to pkl file containing embedding.\n", + "\n", + " Returns:\n", + " PoincareKeyedVectors instance.\n", + "\n", + " \"\"\"\n", + " keyed_vectors_filename = input_filename + '.kv'\n", + " transform_numpy_embedding_to_kv(input_filename, keyed_vectors_filename)\n", + " embedding = PoincareKeyedVectors.load_word2vec_format(keyed_vectors_filename)\n", + " os.unlink(keyed_vectors_filename)\n", + " return embedding\n", + "\n", + "def load_poincare_gensim(input_filename):\n", + " \"\"\"Load embedding trained via Gensim PoincareModel.\n", + "\n", + " Parameters\n", + " ----------\n", + " filepath : str\n", + " Path to model file.\n", + "\n", + " Returns:\n", + " PoincareKeyedVectors instance.\n", + "\n", + " \"\"\"\n", + " model = PoincareModel.load(input_filename)\n", + " return model.kv\n", + "\n", + "def load_model(implementation, model_file):\n", + " \"\"\"Convenience function over functions to load models from different implementations.\n", + " \n", + " Parameters\n", + " ----------\n", + " implementation : str\n", + " Implementation used to create model file ('c++'/'numpy'/'gensim').\n", + " model_file : str\n", + " Path to model file.\n", + " \n", + " Returns\n", + " -------\n", + " PoincareKeyedVectors instance\n", + " \n", + " Notes\n", + " -----\n", + " Raises ValueError in case of invalid value for `implementation`\n", + "\n", + " \"\"\"\n", + " if implementation == 'c++':\n", + " return load_poincare_cpp(model_file)\n", + " elif implementation == 'numpy':\n", + " return load_poincare_numpy(model_file)\n", + " elif implementation == 'gensim':\n", + " return load_poincare_gensim(model_file)\n", + " else:\n", + " raise ValueError('Invalid implementation %s' % implementation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": {}, + "outputs": [], + "source": [ + "def display_results(task_name, results):\n", + " \"\"\"Display evaluation results of multiple embeddings on a single task in a tabular format\n", + " \n", + " Args:\n", + " task_name (str): name the task being evaluated\n", + " results (dict): mapping between embeddings and corresponding results\n", + " \n", + " \"\"\"\n", + " result_table = PrettyTable()\n", + " result_table.field_names = [\"Model Description\", \"Metric\"] + [str(dim) for dim in sorted(model_sizes)]\n", + " for model_name, model_results in results.items():\n", + " metrics = [metric for metric in model_results.keys()]\n", + " dims = sorted([dim for dim in model_results[metrics[0]].keys()])\n", + " description = model_description_from_name(model_name)\n", + " row = [description, '\\n'.join(metrics) + '\\n']\n", + " for dim in dims:\n", + " scores = ['%.2f' % model_results[metric][dim] for metric in metrics]\n", + " row.append('\\n'.join(scores))\n", + " result_table.add_row(row)\n", + " result_table.align = 'r'\n", + " result_html = result_table.get_html_string()\n", + " search = \"\"\n", + " insert_at = result_html.index(search) + len(search)\n", + " new_row = \"\"\"\n", + " \n", + " \n", + " \n", + " \n", + " \"\"\" % (task_name, len(model_sizes))\n", + " result_html = result_html[:insert_at] + new_row + result_html[insert_at:]\n", + " display(HTML(result_html))\n", + " \n", + "def model_description_from_name(model_name):\n", + " if model_name.startswith('gensim'):\n", + " implementation = 'Gensim'\n", + " elif model_name.startswith('cpp'):\n", + " implementation = 'C++'\n", + " elif model_name.startswith('np'):\n", + " implementation = 'Numpy'\n", + " else:\n", + " raise ValueError('Unsupported implementation for model: %s' % model_name)\n", + " description = []\n", + " for param_key in sorted(default_params.keys()):\n", + " pattern = '%s_([^_]*)_?' % param_key\n", + " match = re.search(pattern, model_name)\n", + " if match:\n", + " description.append(\"%s=%s\" % (param_key, match.groups()[0]))\n", + " return \"%s: %s\" % (implementation, \", \".join(description))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4.1 WordNet reconstruction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this task, embeddings are learnt using the entire transitive closure of the WordNet noun hypernym hierarchy. Subsequently, for every hypernym pair `(u, v)`, the rank of `v` amongst all nodes that do not have a positive edge with `v` is computed. The final metric `mean_rank` is the average of all these ranks. The `MAP` metric is the mean of the Average Precision of the rankings for all positive nodes for a given node `u`.\n", + "\n", + "Note that this task tests representation capacity of the learnt embeddings, and not the generalization ability." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "reconstruction_results = OrderedDict()\n", + "metrics = ['mean_rank', 'MAP']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "for implementation, models in sorted(model_files.items()):\n", + " for model_name, files in models.items():\n", + " if model_name in reconstruction_results:\n", + " continue\n", + " reconstruction_results[model_name] = OrderedDict()\n", + " for metric in metrics:\n", + " reconstruction_results[model_name][metric] = {}\n", + " for model_size, model_file in files.items():\n", + " print('Evaluating model %s of size %d' % (model_name, model_size))\n", + " embedding = load_model(implementation, model_file)\n", + " eval_instance = ReconstructionEvaluation(wordnet_file, embedding)\n", + " eval_result = eval_instance.evaluate(max_n=1000)\n", + " for metric in metrics:\n", + " reconstruction_results[model_name][metric][model_size] = eval_result[metric]" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
%s Dimensions
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WordNet Reconstruction Dimensions
Model DescriptionMetric5102050100200
C++: burn_in=0, epochs=200, eps=1e-06, neg=20, threads=8mean_rank
MAP
191.69
0.34
97.65
0.43
72.07
0.51
55.48
0.57
46.76
0.59
49.62
0.59
C++: burn_in=0, epochs=50, eps=1e-06, neg=10, threads=8mean_rank
MAP
280.17
0.27
129.46
0.40
92.06
0.49
80.41
0.53
71.42
0.56
69.30
0.56
C++: burn_in=0, epochs=50, eps=1e-06, neg=20, threads=8mean_rank
MAP
265.72
0.28
116.94
0.41
90.81
0.49
59.47
0.56
55.14
0.58
54.31
0.59
C++: burn_in=10, epochs=50, eps=1e-06, neg=20, threads=8mean_rank
MAP
252.86
0.26
195.73
0.32
182.57
0.34
165.33
0.36
157.37
0.36
155.78
0.36
Gensim: batch_size=10, burn_in=10, epochs=50, neg=20, reg=0.0mean_rank
MAP
108.01
0.37
100.73
0.47
97.38
0.48
94.49
0.49
94.68
0.48
89.66
0.49
Gensim: batch_size=10, burn_in=0, epochs=50, neg=20, reg=0.0mean_rank
MAP
154.41
0.40
62.77
0.63
27.32
0.72
20.22
0.77
16.15
0.78
13.20
0.79
Gensim: batch_size=10, burn_in=0, epochs=50, neg=10, reg=0.0mean_rank
MAP
211.71
0.33
54.42
0.60
24.90
0.72
21.42
0.76
15.80
0.78
15.13
0.79
Gensim: batch_size=50, burn_in=0, epochs=50, neg=20, reg=0.0mean_rank
MAP
148.51
0.38
63.67
0.62
28.36
0.72
20.23
0.76
15.75
0.78
13.59
0.79
Gensim: batch_size=10, burn_in=10, epochs=200, neg=10, reg=1mean_rank
MAP
61.48
0.38
54.70
0.41
53.02
0.41
50.80
0.42
49.58
0.42
48.56
0.43
Numpy: epochs=50, neg=20mean_rank
MAP
9617.57
0.14
5902.65
0.16
3868.78
0.19
1117.77
0.25
529.92
0.30
377.45
0.35
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_results('WordNet Reconstruction', reconstruction_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Results from the paper -\n", + "![Reconstruction Results](https://raw.githubusercontent.com/RaRe-Technologies/gensim/poincare_model_keyedvectors/docs/notebooks/poincare/reconstruction_paper.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The figures above illustrate a few things - \n", + "1. The gensim implementation does significantly better for all model sizes and hyperparameters than both the other implementations.\n", + "2. The results from the original paper have not been achieved by our implementation. Especially for models with lower dimensions, the paper mentions significantly better mean rank and MAP for the reconstruction task.\n", + "3. Using burn-in and regularization leads to much better results with low model sizes, however the results do not improve significantly with increasing model size. This might have to do with tuning the regularization coefficient, which the paper does not mention." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4.2 WordNet link prediction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This task is similar to the reconstruction task described above, except that the list of relations is split into a training and testing set, and the mean rank reported is for the edges in the test set.\n", + "\n", + "Therefore, this tests the ability of the model to predict unseen edges between nodes, i.e. generalization ability, as opposed to the representation capacity tested in the Reconstruction task" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.2.1 Preparing data" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "def train_test_split(data_file, test_ratio=0.1):\n", + " \"\"\"Creates train and test files from given data file, returns train/test file names\n", + " \n", + " Args:\n", + " data_file (str): path to data file for which train/test split is to be created\n", + " test_ratio (float): fraction of lines to be used for test data\n", + " \n", + " Returns\n", + " (train_file, test_file): tuple of strings with train file and test file paths\n", + " \"\"\"\n", + " train_filename = data_file + '.train'\n", + " test_filename = data_file + '.test'\n", + " if os.path.exists(train_filename) and os.path.exists(test_filename):\n", + " print('Train and test files already exist, skipping')\n", + " return (train_filename, test_filename)\n", + " root_nodes, leaf_nodes = get_root_and_leaf_nodes(data_file)\n", + " test_line_candidates = []\n", + " line_count = 0\n", + " all_nodes = set()\n", + " with open(data_file, 'rb') as f:\n", + " for i, line in enumerate(f):\n", + " node_1, node_2 = line.split()\n", + " all_nodes.update([node_1, node_2])\n", + " if (\n", + " node_1 not in leaf_nodes\n", + " and node_2 not in leaf_nodes\n", + " and node_1 not in root_nodes\n", + " and node_2 not in root_nodes\n", + " and node_1 != node_2\n", + " ):\n", + " test_line_candidates.append(i)\n", + " line_count += 1\n", + "\n", + " num_test_lines = int(test_ratio * line_count)\n", + " if num_test_lines > len(test_line_candidates):\n", + " raise ValueError('Not enough candidate relations for test set')\n", + " print('Choosing %d test lines from %d candidates' % (num_test_lines, len(test_line_candidates)))\n", + " test_line_indices = set(random.sample(test_line_candidates, num_test_lines))\n", + " train_line_indices = set(l for l in range(line_count) if l not in test_line_indices)\n", + " \n", + " train_set_nodes = set()\n", + " with open(data_file, 'rb') as f:\n", + " train_file = open(train_filename, 'wb')\n", + " test_file = open(test_filename, 'wb')\n", + " for i, line in enumerate(f):\n", + " if i in train_line_indices:\n", + " train_set_nodes.update(line.split())\n", + " train_file.write(line)\n", + " elif i in test_line_indices:\n", + " test_file.write(line)\n", + " else:\n", + " raise AssertionError('Line %d not present in either train or test line indices' % i)\n", + " train_file.close()\n", + " test_file.close()\n", + " assert len(train_set_nodes) == len(all_nodes), 'Not all nodes from dataset present in train set relations'\n", + " return (train_filename, test_filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "def get_root_and_leaf_nodes(data_file):\n", + " \"\"\"Return keys of root and leaf nodes from a file with transitive closure relations\n", + " \n", + " Args:\n", + " data_file(str): file path containing transitive closure relations\n", + " \n", + " Returns:\n", + " (root_nodes, leaf_nodes) - tuple containing keys of root and leaf nodes\n", + " \"\"\"\n", + " root_candidates = set()\n", + " leaf_candidates = set()\n", + " with open(data_file, 'rb') as f:\n", + " for line in f:\n", + " nodes = line.split()\n", + " root_candidates.update(nodes)\n", + " leaf_candidates.update(nodes)\n", + " \n", + " with open(data_file, 'rb') as f:\n", + " for line in f:\n", + " node_1, node_2 = line.split()\n", + " if node_1 == node_2:\n", + " continue\n", + " leaf_candidates.discard(node_1)\n", + " root_candidates.discard(node_2)\n", + " \n", + " return (leaf_candidates, root_candidates)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train and test files already exist, skipping\n" + ] + } + ], + "source": [ + "wordnet_train_file, wordnet_test_file = train_test_split(wordnet_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.2.2 Training models" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "# Training models for link prediction\n", + "lp_model_files = {}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lp_model_files['c++'] = {}\n", + "# Train c++ models with default params\n", + "model_name, files = train_model_with_params(default_params, wordnet_train_file, model_sizes, 'cpp_lp_model', 'c++')\n", + "lp_model_files['c++'][model_name] = {}\n", + "for dim, filepath in files.items():\n", + " lp_model_files['c++'][model_name][dim] = filepath\n", + "# Train c++ models with non-default params\n", + "for param, values in non_default_params.items():\n", + " params = default_params.copy()\n", + " for value in values:\n", + " params[param] = value\n", + " model_name, files = train_model_with_params(params, wordnet_train_file, model_sizes, 'cpp_lp_model', 'c++')\n", + " lp_model_files['c++'][model_name] = {}\n", + " for dim, filepath in files.items():\n", + " lp_model_files['c++'][model_name][dim] = filepath" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lp_model_files['numpy'] = {}\n", + "# Train numpy models with default params\n", + "model_name, files = train_model_with_params(default_params, wordnet_train_file, model_sizes, 'np_lp_model', 'numpy')\n", + "lp_model_files['numpy'][model_name] = {}\n", + "for dim, filepath in files.items():\n", + " lp_model_files['numpy'][model_name][dim] = filepath" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lp_model_files['gensim'] = {}\n", + "# Train models with default params\n", + "model_name, files = train_model_with_params(default_params, wordnet_train_file, model_sizes, 'gensim_lp_model', 'gensim')\n", + "lp_model_files['gensim'][model_name] = {}\n", + "for dim, filepath in files.items():\n", + " lp_model_files['gensim'][model_name][dim] = filepath\n", + "# Train models with non-default params\n", + "for new_params in non_default_params_gensim:\n", + " params = default_params.copy()\n", + " params.update(new_params)\n", + " model_name, files = train_model_with_params(params, wordnet_file, model_sizes, 'gensim_lp_model', 'gensim')\n", + " lp_model_files['gensim'][model_name] = {}\n", + " for dim, filepath in files.items():\n", + " lp_model_files['gensim'][model_name][dim] = filepath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.2.3 Evaluating models" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [], + "source": [ + "lp_results = OrderedDict()\n", + "metrics = ['mean_rank', 'MAP']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for implementation, models in sorted(lp_model_files.items()):\n", + " for model_name, files in models.items():\n", + " lp_results[model_name] = OrderedDict()\n", + " for metric in metrics:\n", + " lp_results[model_name][metric] = {}\n", + " for model_size, model_file in files.items():\n", + " print('Evaluating model %s of size %d' % (model_name, model_size))\n", + " embedding = load_model(implementation, model_file)\n", + " eval_instance = LinkPredictionEvaluation(wordnet_train_file, wordnet_test_file, embedding)\n", + " eval_result = eval_instance.evaluate(max_n=1000)\n", + " for metric in metrics:\n", + " lp_results[model_name][metric][model_size] = eval_result[metric]" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WordNet Link Prediction Dimensions
Model DescriptionMetric5102050100200
C++: burn_in=0, epochs=200, eps=1e-06, neg=20, threads=8mean_rank
MAP
218.26
0.15
99.09
0.24
60.50
0.31
52.24
0.35
60.81
0.36
69.13
0.36
C++: burn_in=0, epochs=50, eps=1e-06, neg=20, threads=8mean_rank
MAP
687.48
0.12
281.88
0.15
72.95
0.31
57.37
0.35
52.56
0.36
61.42
0.36
C++: burn_in=0, epochs=50, eps=1e-06, neg=10, threads=8mean_rank
MAP
230.34
0.14
123.24
0.22
75.62
0.28
65.97
0.31
55.33
0.33
56.89
0.34
C++: burn_in=10, epochs=50, eps=1e-06, neg=20, threads=8mean_rank
MAP
236.31
0.10
214.85
0.13
193.30
0.14
180.27
0.15
169.00
0.16
163.22
0.16
Gensim: batch_size=10, burn_in=0, epochs=50, neg=10, reg=0.0mean_rank
MAP
141.52
0.18
58.89
0.34
31.66
0.46
22.13
0.51
21.29
0.52
19.38
0.53
Gensim: batch_size=10, burn_in=0, epochs=50, neg=20, reg=0.0mean_rank
MAP
121.42
0.19
52.51
0.37
24.61
0.46
19.96
0.52
20.44
0.50
19.55
0.54
Gensim: batch_size=50, burn_in=0, epochs=50, neg=20, reg=0.0mean_rank
MAP
144.19
0.19
53.65
0.35
25.21
0.47
20.68
0.52
21.32
0.51
18.97
0.53
Gensim: batch_size=10, burn_in=10, epochs=50, neg=20, reg=0.0mean_rank
MAP
154.95
0.16
138.12
0.21
122.06
0.24
117.96
0.26
112.99
0.25
110.84
0.26
Gensim: batch_size=10, burn_in=10, epochs=200, neg=10, reg=1mean_rank
MAP
51.72
0.22
39.85
0.28
38.60
0.29
36.55
0.30
35.32
0.31
34.66
0.31
Numpy: epochs=50, neg=20mean_rank
MAP
14526.67
0.01
8411.10
0.02
5749.57
0.04
1873.12
0.07
1639.50
0.10
1350.13
0.13
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_results('WordNet Link Prediction', lp_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Results from the paper -\n", + "![Link Prediction Paper](https://raw.githubusercontent.com/RaRe-Technologies/gensim/poincare_model_keyedvectors/docs/notebooks/poincare/link_prediction_paper.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These results follow similar trends as the reconstruction results. Repeating here for ease of reading - \n", + "1. The gensim implementation does significantly better for all model sizes and hyperparameters than both the other implementations.\n", + "2. The results from the original paper have not been achieved by our implementation. Especially for models with lower dimensions, the paper mentions significantly better mean rank and MAP for the link prediction task.\n", + "4. Using burn-in and regularization leads to better results with low model sizes, however the results do not improve significantly with increasing model size.\n", + "\n", + "The main difference from the reconstruction results is that mean ranks for link prediction are slightly worse most of the time than the corresponding reconstruction results. This is to be expected, as link prediction is performed on a held-out test set." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4.3 HyperLex Lexical Entailment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Lexical Entailment task is performed using the HyperLex dataset, a collection of 2163 noun pairs and scores that denote \"To what degree is noun A a type of noun Y\". For example - \n", + " \n", + "`girl person 9.85`\n", + "\n", + "These scores are out of 10.\n", + "\n", + "The [spearman's correlation score](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient) is computed for the predicted and actual similarity scores, with the models trained on the entire WordNet noun hierarchy.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [], + "source": [ + "entailment_results = OrderedDict()\n", + "eval_instance = LexicalEntailmentEvaluation(hyperlex_file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "for implementation, models in sorted(model_files.items()):\n", + " for model_name, files in models.items():\n", + " if model_name in entailment_results:\n", + " continue\n", + " entailment_results[model_name] = OrderedDict()\n", + " entailment_results[model_name]['spearman'] = {}\n", + " for model_size, model_file in files.items():\n", + " print('Evaluating model %s of size %d' % (model_name, model_size))\n", + " embedding = load_model(implementation, model_file)\n", + " entailment_results[model_name]['spearman'][model_size] = eval_instance.evaluate_spearman(embedding)" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Lexical Entailment (HyperLex) Dimensions
Model DescriptionMetric5102050100200
C++: burn_in=0, epochs=200, eps=1e-06, neg=20, threads=8spearman
0.450.460.450.450.450.46
C++: burn_in=0, epochs=50, eps=1e-06, neg=10, threads=8spearman
0.420.410.430.420.430.43
C++: burn_in=0, epochs=50, eps=1e-06, neg=20, threads=8spearman
0.440.430.470.440.450.44
C++: burn_in=10, epochs=50, eps=1e-06, neg=20, threads=8spearman
0.430.420.440.440.440.45
Gensim: batch_size=10, burn_in=10, epochs=50, neg=20, reg=0.0spearman
0.450.460.450.460.450.46
Gensim: batch_size=10, burn_in=0, epochs=50, neg=20, reg=0.0spearman
0.470.450.470.470.480.47
Gensim: batch_size=10, burn_in=0, epochs=50, neg=10, reg=0.0spearman
0.460.460.450.470.470.48
Gensim: batch_size=50, burn_in=0, epochs=50, neg=20, reg=0.0spearman
0.460.460.470.470.480.47
Gensim: batch_size=10, burn_in=10, epochs=200, neg=10, reg=1spearman
0.520.510.510.510.520.51
Numpy: epochs=50, neg=20spearman
0.150.190.200.200.240.26
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_results('Lexical Entailment (HyperLex)', entailment_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Results from paper (for Poincaré Embeddings, as well as other embeddings from previous papers) - \n", + "![LE Results](https://raw.githubusercontent.com/RaRe-Technologies/gensim/poincare_model_keyedvectors/docs/notebooks/poincare/entailment_paper.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some observations - \n", + "1. We achieve a max spearman score of 0.48, fairly close to the spearman score of 0.512 mentioned in the paper.\n", + "2. The best results are obtained with 20 negative examples, a batch size of 10, and no burn-in, however the differences are too low to make a meaningful conclusion.\n", + "\n", + "However, there are a few ambiguities and caveats - \n", + "1. The paper does not mention which hyperparameters and model size have been used for the above mentioned result. Hence it is possible that the results are achieved with a significantly lower model size than the one we use, which would imply that our implementation still has some way to go.\n", + "2. The same word can have multiple nodes in the WordNet dataset for different senses of the word, and it is unclear in the paper how to decide which node to pick. For the above results, we have gone with the sane default of picking the particular sense that has the maximum similarity score with the target word.\n", + "3. Certain words in the HyperLex dataset seem to be absent from the WordNet data - the paper does not mention any such thing. Pairs containing missing words have been omitted from the evaluation (182/2163).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4.4 Link Prediction on Collaboration Networks\n", + "\n", + "The paper also describes a variant of the Poincaré model to learn embeddings of nodes in a symmetric graph, unlike the WordNet noun hierarchy, which is directed and asymmetric. The datasets used in the paper for this model are scientific collaboration networks, in which the nodes are researchers and an edge represents that the two researchers have co-authored a paper.\n", + "\n", + "This variant has not been implemented yet, and is therefore not a part of our experiments." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Next Steps" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. The model can be investigated further to understand why it doesn't produce results as good as the paper. It is possible that this might be due to training details not present in the paper, or due to us incorrectly interpreting some ambiguous parts of the paper. We have not been able to clarify all such ambiguitities in communication with the authors.\n", + "2. Optimizing the training process further - with a model size of 50 dimensions and a dataset with ~700k relations and ~80k nodes, the Gensim implementation takes around 45 seconds to complete an epoch (~15k relations per second), whereas the open source C++ implementation takes around 1/6th the time (~95k relations per second).\n", + "3. Implementing the variant of the model mentioned in the paper for symmetric graphs and evaluating on the scientific collaboration datasets described earlier in the report." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/notebooks/Poincare Tutorial.ipynb b/docs/notebooks/Poincare Tutorial.ipynb new file mode 100644 index 0000000000..c7eeb23b3f --- /dev/null +++ b/docs/notebooks/Poincare Tutorial.ipynb @@ -0,0 +1,704 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tutorial on Poincaré Embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook discusses the basic ideas and use-cases for Poincaré embeddings and demonstrates what kind of operations can be done with them. For more comprehensive technical details and results, this [blog post](https://rare-technologies.com/implementing-poincare-embeddings) may be a more appropriate resource." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.1 Concept and use-case\n", + "\n", + "Poincaré embeddings are a method to learn vector representations of nodes in a graph. The input data is of the form of a list of relations (edges) between nodes, and the model tries to learn representations such that the vectors for the nodes accurately represent the distances between them.\n", + "\n", + "The learnt embeddings capture notions of both _hierarchy_ and _similarity_ - similarity by placing connected nodes close to each other and unconnected nodes far from each other; hierarchy by placing nodes lower in the hierarchy farther from the origin, i.e. with higher norms.\n", + "\n", + "The paper uses this model to learn embeddings of nodes in the WordNet noun hierarchy, and evaluates these on 3 tasks - reconstruction, link prediction and lexical entailment, which are described in the section on evaluation. We have compared the results of our Poincaré model implementation on these tasks to other open-source implementations and the results mentioned in the paper.\n", + "\n", + "The paper also describes a variant of the Poincaré model to learn embeddings of nodes in a symmetric graph, unlike the WordNet noun hierarchy, which is directed and asymmetric. The datasets used in the paper for this model are scientific collaboration networks, in which the nodes are researchers and an edge represents that the two researchers have co-authored a paper.\n", + "\n", + "This variant has not been implemented yet, and is therefore not a part of our tutorial and experiments.\n", + "\n", + "\n", + "### 1.2 Motivation\n", + "\n", + "The main innovation here is that these embeddings are learnt in hyperbolic space, as opposed to the commonly used Euclidean space. The reason behind this is that hyperbolic space is more suitable for capturing any hierarchical information inherently present in the graph. Embedding nodes into a Euclidean space while preserving the distance between the nodes usually requires a very high number of dimensions. A simple illustration of this can be seen below - \n", + " \n", + " ![Example tree](https://raw.githubusercontent.com/RaRe-Technologies/gensim/poincare_model_keyedvectors/docs/notebooks/poincare/example_tree.png)\n", + "\n", + "Here, the positions of nodes represent the positions of their vectors in 2-D euclidean space. Ideally, the distances between the vectors for nodes `(A, D)` should be the same as that between `(D, H)` and as that between `H` and its child nodes. Similarly, all the child nodes of `H` must be equally far away from node `A`. It becomes progressively hard to accurately preserve these distances in Euclidean space as the degree and depth of the tree grows larger. Hierarchical structures may also have cross-connections (effectively a directed graph), making this harder.\n", + "\n", + "There is no representation of this simple tree in 2-dimensional Euclidean space which can reflect these distances correctly. This can be solved by adding more dimensions, but this becomes computationally infeasible as the number of required dimensions grows exponentially. \n", + "Hyperbolic space is a metric space in which distances aren't straight lines - they are curves, and this allows such tree-like hierarchical structures to have a representation that captures the distances more accurately even in low dimensions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Training the embedding" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/jayant/projects/gensim\n" + ] + } + ], + "source": [ + "% cd ../.." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload \n", + "%autoreload 2\n", + "\n", + "import os\n", + "import logging\n", + "import numpy as np\n", + "\n", + "from gensim.models.poincare import PoincareModel, PoincareKeyedVectors, PoincareRelations\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "\n", + "poincare_directory = os.path.join(os.getcwd(), 'docs', 'notebooks', 'poincare')\n", + "data_directory = os.path.join(poincare_directory, 'data')\n", + "wordnet_mammal_file = os.path.join(data_directory, 'wordnet_mammal_hypernyms.tsv')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model can be initialized using an iterable of relations, where a relation is simply a pair of nodes - " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gensim.models.poincare:Loading relations from train data..\n", + "INFO:gensim.models.poincare:Loaded 2 relations from train data, 3 nodes\n" + ] + } + ], + "source": [ + "model = PoincareModel(train_data=[('node.1', 'node.2'), ('node.2', 'node.3')])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model can also be initialized from a csv-like file containing one relation per line. The module provides a convenience class `PoincareRelations` to do so." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gensim.models.poincare:Loading relations from train data..\n", + "INFO:gensim.models.poincare:Loaded 7724 relations from train data, 1182 unique terms\n" + ] + } + ], + "source": [ + "relations = PoincareRelations(file_path=wordnet_mammal_file, delimiter='\\t')\n", + "model = PoincareModel(train_data=relations)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the above only initializes the model and does not begin training. To train the model - " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gensim.models.poincare:Loading relations from train data..\n", + "INFO:gensim.models.poincare:Loaded 7724 relations from train data, 1182 unique terms\n", + "INFO:gensim.models.poincare:training model of size 2 with 1 workers on 7724 relations for 1 epochs and 0 burn-in epochs, using lr=0.10000 burn-in lr=0.01000 negative=10\n", + "INFO:gensim.models.poincare:Starting training (1 epochs)----------------------------------------\n", + "INFO:gensim.models.poincare:Training on epoch 1, examples #4990-#5000, loss: 23.57\n", + "INFO:gensim.models.poincare:Time taken for 5000 examples: 0.47 s, 10562.18 examples / s\n", + "INFO:gensim.models.poincare:Training finished\n" + ] + } + ], + "source": [ + "model = PoincareModel(train_data=relations, size=2, burn_in=0)\n", + "model.train(epochs=1, print_every=500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The same model can be trained further on more epochs in case the user decides that the model hasn't converged yet." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gensim.models.poincare:training model of size 2 with 1 workers on 7724 relations for 1 epochs and 0 burn-in epochs, using lr=0.10000 burn-in lr=0.01000 negative=10\n", + "INFO:gensim.models.poincare:Starting training (1 epochs)----------------------------------------\n", + "INFO:gensim.models.poincare:Training on epoch 1, examples #4990-#5000, loss: 21.98\n", + "INFO:gensim.models.poincare:Time taken for 5000 examples: 0.48 s, 10442.40 examples / s\n", + "INFO:gensim.models.poincare:Training finished\n" + ] + } + ], + "source": [ + "model.train(epochs=1, print_every=500)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model can be saved and loaded using two different methods - " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gensim.utils:saving PoincareModel object under /tmp/test_model, separately None\n", + "INFO:gensim.utils:saved /tmp/test_model\n", + "INFO:gensim.utils:loading PoincareModel object from /tmp/test_model\n", + "INFO:gensim.utils:loading kv recursively from /tmp/test_model.kv.* with mmap=None\n", + "INFO:gensim.utils:loaded /tmp/test_model\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Saves the entire PoincareModel instance, the loaded model can be trained further\n", + "model.save('/tmp/test_model')\n", + "PoincareModel.load('/tmp/test_model')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gensim.models.keyedvectors:storing 3x50 projection weights into /tmp/test_vectors\n", + "INFO:gensim.models.keyedvectors:loading projection weights from /tmp/test_vectors\n", + "INFO:gensim.models.keyedvectors:loaded (3, 50) matrix from /tmp/test_vectors\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Saves only the vectors from the PoincareModel instance, in the commonly used word2vec format\n", + "model.kv.save_word2vec_format('/tmp/test_vectors')\n", + "PoincareKeyedVectors.load_word2vec_format('/tmp/test_vectors')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. What the embedding can be used for" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gensim.utils:loading PoincareModel object from /home/jayant/projects/gensim/docs/notebooks/poincare/models/gensim_model_batch_size_10_burn_in_0_epochs_50_neg_20_dim_50\n", + "INFO:gensim.utils:loading kv recursively from /home/jayant/projects/gensim/docs/notebooks/poincare/models/gensim_model_batch_size_10_burn_in_0_epochs_50_neg_20_dim_50.kv.* with mmap=None\n", + "INFO:gensim.utils:loaded /home/jayant/projects/gensim/docs/notebooks/poincare/models/gensim_model_batch_size_10_burn_in_0_epochs_50_neg_20_dim_50\n" + ] + } + ], + "source": [ + "# Load an example model\n", + "models_directory = os.path.join(poincare_directory, 'models')\n", + "test_model_path = os.path.join(models_directory, 'gensim_model_batch_size_10_burn_in_0_epochs_50_neg_20_dim_50')\n", + "model = PoincareModel.load(test_model_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The learnt representations can be used to perform various kinds of useful operations. This section is split into two - some simple operations that are directly mentioned in the paper, as well as some experimental operations that are hinted at, and might require more work to refine.\n", + "\n", + "The models that are used in this section have been trained on the transitive closure of the WordNet hypernym graph. The transitive closure is the list of all the direct and indirect hypernyms in the WordNet graph. An example of a direct hypernym is `(seat.n.03, furniture.n.01)` while an example of an indirect hypernym is `(seat.n.03, physical_entity.n.01)`.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.1 Simple operations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All the following operations are based simply on the notion of distance between two nodes in hyperbolic space." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.9232418343441235" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Distance between any two nodes\n", + "model.kv.distance('plant.n.02', 'tree.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.5111423377921103" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.kv.distance('plant.n.02', 'animal.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('phenomenon.n.01', 2.0296901412261614),\n", + " ('natural_phenomenon.n.01', 2.1052921648852934),\n", + " ('physical_phenomenon.n.01', 2.1084626073820045),\n", + " ('photoelectricity.n.01', 2.4527217652991005),\n", + " ('piezoelectricity.n.01', 2.4687111939575397),\n", + " ('galvanism.n.01', 2.9496409087300357),\n", + " ('cloud.n.02', 3.164090455102602),\n", + " ('electrical_phenomenon.n.01', 3.2563741920630225),\n", + " ('pressure.n.01', 3.3063009504377368),\n", + " ('atmospheric_phenomenon.n.01', 3.313970950348909)]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Nodes most similar to a given input node\n", + "model.kv.most_similar('electricity.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('male.n.02', 1.725430794111438),\n", + " ('physical_entity.n.01', 3.5532684790327624),\n", + " ('whole.n.02', 3.5663516391532815),\n", + " ('object.n.01', 3.5885342299888077),\n", + " ('adult.n.01', 3.6422291495399124),\n", + " ('organism.n.01', 4.096498630105297),\n", + " ('causal_agent.n.01', 4.127447093914292),\n", + " ('living_thing.n.01', 4.198756842588067),\n", + " ('person.n.01', 4.371831459784078),\n", + " ('lawyer.n.01', 4.581830548066727)]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.kv.most_similar('man.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['domestic_animal.n.01',\n", + " 'canine.n.02',\n", + " 'terrier.n.01',\n", + " 'hunting_dog.n.01',\n", + " 'hound.n.01']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Nodes closer to node 1 than node 2 is from node 1\n", + "model.kv.nodes_closer_than('dog.n.01', 'carnivore.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Rank of distance of node 2 from node 1 in relation to distances of all nodes from node 1\n", + "model.kv.rank('dog.n.01', 'carnivore.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.24618276804\n", + "[ 0.20492232 0.21622492 0.22568267 0.20813361 0.26086168]\n" + ] + } + ], + "source": [ + "# Finding Poincare distance between input vectors\n", + "vector_1 = np.random.uniform(size=(100,))\n", + "vector_2 = np.random.uniform(size=(100,))\n", + "vectors_multiple = np.random.uniform(size=(5, 100))\n", + "\n", + "# Distance between vector_1 and vector_2\n", + "print(PoincareKeyedVectors.vector_distance(vector_1, vector_2))\n", + "# Distance between vector_1 and each vector in vectors_multiple\n", + "print(PoincareKeyedVectors.vector_distance_batch(vector_1, vectors_multiple))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2 Experimental operations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These operations are based on the notion that the norm of a vector represents its hierarchical position. Leaf nodes typically tend to have the highest norms, and as we move up the hierarchy, the norm decreases, with the root node being close to the center (or origin)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'writer.n.01'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Closest child node\n", + "model.kv.closest_child('person.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'causal_agent.n.01'" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Closest parent node\n", + "model.kv.closest_parent('person.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.940798238231\n", + "0.967868985302\n" + ] + } + ], + "source": [ + "# Position in hierarchy - lower values represent that the node is higher in the hierarchy\n", + "print(model.kv.norm('person.n.01'))\n", + "print(model.kv.norm('teacher.n.01'))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.027070747071\n" + ] + } + ], + "source": [ + "# Difference in hierarchy between the first node and the second node\n", + "# Positive values indicate the first node is higher in the hierarchy\n", + "print(model.kv.difference_in_hierarchy('person.n.01', 'teacher.n.01'))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['carnivore.n.01',\n", + " 'dog.n.01',\n", + " 'hunting_dog.n.01',\n", + " 'terrier.n.01',\n", + " 'sporting_dog.n.01']" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# One possible descendant chain\n", + "model.kv.descendants('mammal.n.01')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['canine.n.02',\n", + " 'domestic_animal.n.01',\n", + " 'placental.n.01',\n", + " 'ungulate.n.01',\n", + " 'chordate.n.01',\n", + " 'animal.n.01',\n", + " 'physical_entity.n.01']" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# One possible ancestor chain\n", + "model.kv.ancestors('dog.n.01')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the chains are not symmetric - while descending to the closest child recursively, starting with `mammal`, the closest child of `carnivore` is `dog`, however, while ascending from `dog` to the closest parent, the closest parent to `dog` is `canine`. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is despite the fact that Poincaré distance is symmetric (like any distance in a metric space). The asymmetry stems from the fact that even if node `Y` is the closest node to node `X` amongst all nodes with a higher norm (lower in the hierarchy) than `X`, node `X` may not be the closest node to node `Y` amongst all the nodes with a lower norm (higher in the hierarchy) than `Y`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Useful Links" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. [Original paper by Facebook AI Research](https://arxiv.org/pdf/1705.08039)\n", + "2. [Blog post describing technical challenges in implementation](https://rare-technologies.com/implementing-poincare-embeddings)\n", + "3. [Detailed evaluation notebook to reproduce results](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/Poincare%20Evaluation.ipynb)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/notebooks/doc2vec-IMDB.ipynb b/docs/notebooks/doc2vec-IMDB.ipynb index f4a2ec2ae3..415f9ae837 100644 --- a/docs/notebooks/doc2vec-IMDB.ipynb +++ b/docs/notebooks/doc2vec-IMDB.ipynb @@ -905,7 +905,7 @@ "# Download this file: https://github.com/nicholas-leonard/word2vec/blob/master/questions-words.txt\n", "# and place it in the local directory\n", "# Note: this takes many minutes\n", - "if os.path.isfile('question-words.txt'):\n", + "if os.path.isfile('questions-words.txt'):\n", " for model in word_models:\n", " sections = model.accuracy('questions-words.txt')\n", " correct, incorrect = len(sections[-1]['correct']), len(sections[-1]['incorrect'])\n", diff --git a/docs/notebooks/poincare/entailment_eval.png b/docs/notebooks/poincare/entailment_eval.png new file mode 100644 index 0000000000000000000000000000000000000000..ae841cfaf06aa54aaa144c8d745fc96ec24d2480 GIT binary patch literal 132846 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 z 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

9-dJ+~OLgzQ+N6XW`$8{)ct?bN>y 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

^Kz>iwq(id8&W^$SJ%V$j>RZeL?>QHa^ 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%0DwBIF%{XPvDe(_Jx`};7s>)H$tmv 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/notebooks/poincare/link_prediction_paper.png b/docs/notebooks/poincare/link_prediction_paper.png new file mode 100644 index 0000000000000000000000000000000000000000..eca59168c2ff7d0040f38a9a927910707174465a GIT binary patch literal 172214 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�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%0Av(7BPAB> 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 literal 0 HcmV?d00001 diff --git a/docs/notebooks/poincare/poincare_burn_in_eps.patch b/docs/notebooks/poincare/poincare_burn_in_eps.patch new file mode 100644 index 0000000000..7464919209 --- /dev/null +++ b/docs/notebooks/poincare/poincare_burn_in_eps.patch @@ -0,0 +1,197 @@ +diff --git a/include/poincare_embedding.hpp b/include/poincare_embedding.hpp +index f1f1c5f..e1d68cc 100644 +--- a/include/poincare_embedding.hpp ++++ b/include/poincare_embedding.hpp +@@ -22,7 +22,7 @@ + + namespace poincare_disc{ + +- constexpr float EPS = 1e-6; ++ // constexpr float EPS = 1e-6; + + /////////////////////////////////////////////////////////////////////////////////////////// + // Initializer +@@ -114,11 +114,12 @@ namespace poincare_disc{ + return *this; + } + +- Vector& add_clip_(const real c, const Vector& v, const real thresh=1.0-EPS) ++ Vector& add_clip_(const real c, const Vector& v, const real eps) + { + real uu = this->squared_sum(), uv = this->dot(v), vv = v.squared_sum(); + real C = uu + 2*c*uv + c*c*vv; // resulting norm + real scale = 1.0; ++ real thresh = 1.0 - eps; + if(C > thresh * thresh){ + scale = thresh / sqrt(C); + } +@@ -132,7 +133,7 @@ namespace poincare_disc{ + data_.get()[i] = (data_.get()[i] + c * v.data_.get()[i]) * scale; + } + } +- assert(this->squared_sum() <= (thresh + EPS) * (thresh+EPS)); ++ assert(this->squared_sum() <= (thresh + eps) * (thresh+eps)); + return *this; + } + +@@ -251,7 +252,7 @@ namespace poincare_disc{ + using real = RealType; + public: + Distance(): u_(), v_(), uu_(), vv_(), uv_(), alpha_(), beta_(), gamma_() {} +- real operator()(const Vector& u, const Vector& v) ++ real operator()(const Vector& u, const Vector& v, real eps) + { + u_ = u; + v_ = v; +@@ -259,11 +260,11 @@ namespace poincare_disc{ + vv_ = v_.squared_sum(); + uv_ = u_.dot(v_); + alpha_ = 1 - uu_; +- if(alpha_ <= 0){ alpha_ = EPS; } // TODO: ensure 0 <= uu_ <= 1-EPS; ++ if(alpha_ <= 0){ alpha_ = eps; } // TODO: ensure 0 <= uu_ <= 1-eps; + // if(!(alpha_ > 0)){ std::cout << "uu_: " << uu_ << ", alpha_: " << alpha_ << std::endl; } + // assert(alpha_ > 0); + beta_ = 1 - vv_; +- if(beta_ <= 0){ beta_ = EPS; } // TODO: ensure 0 <= vv_ <= 1-EPS; ++ if(beta_ <= 0){ beta_ = eps; } // TODO: ensure 0 <= vv_ <= 1-eps; + // if(!(beta_ > 0)){ std::cout << "vv_: " << vv_ << ", beta_: " << beta_ << std::endl; } + // assert(beta_ > 0); + gamma_ = 1 + 2 * (uu_ - 2 * uv_ + vv_) / alpha_ / beta_; +@@ -406,11 +407,14 @@ namespace poincare_disc{ + char delim = '\t'; + real lr0 = 0.01; // learning rate + real lr1 = 0.0001; // learning rate ++ real eps = 1e-6; // epsilon for numerical stability in clipping ++ std::size_t burn_in = 0; // whether to use burn-in for initialization + }; + + template +- void clip(Vector& v, const RealType& thresh = 1-EPS) ++ void clip(Vector& v, const RealType& eps) + { ++ RealType thresh = 1.0 - eps; + RealType vv = v.squared_sum(); + if(vv >= thresh*thresh){ + v.mult_(thresh / std::sqrt(vv)); +@@ -500,7 +504,7 @@ namespace poincare_disc{ + + // clip + for(std::size_t i = 0, I = embeddings.nrow(); i < I; ++i){ +- clip(embeddings[i]); ++ clip(embeddings[i], config.eps); + } + + // construct negative sampler +@@ -551,7 +555,7 @@ namespace poincare_disc{ + auto i = left_indices[0] = itr->first; + auto j = right_indices[0] = itr->second; + +- exp_neg_dist_values[0] = std::exp(-dists[0](embeddings[i], embeddings[j])); ++ exp_neg_dist_values[0] = std::exp(-dists[0](embeddings[i], embeddings[j], config.eps)); + for(std::size_t k = 0; k < config.neg_size; ++k){ + #if SAMPLING_STRATEGY == LEFT_SAMPLING + auto i = left_indices[k + 1] = negative_sampler(); +@@ -563,7 +567,7 @@ namespace poincare_disc{ + auto i = left_indices[k + 1] = negative_sampler(); + auto j = right_indices[k + 1] = negative_sampler(); + #endif +- exp_neg_dist_values[k + 1] = std::exp(-dists[k + 1](embeddings[i], embeddings[j])); ++ exp_neg_dist_values[k + 1] = std::exp(-dists[k + 1](embeddings[i], embeddings[j], config.eps)); + } + + // compute gradient +@@ -589,8 +593,8 @@ namespace poincare_disc{ + // update + for(std::size_t k = 0; k < 1 + config.neg_size; ++k){ + auto i = left_indices[k], j = right_indices[k]; +- embeddings[i].add_clip_(-lr(), left_grads[k]); +- embeddings[j].add_clip_(-lr(), right_grads[k]); ++ embeddings[i].add_clip_(-lr(), left_grads[k], config.eps); ++ embeddings[j].add_clip_(-lr(), right_grads[k], config.eps); + } + + lr.update(); +@@ -634,6 +638,22 @@ namespace poincare_disc{ + + std::cout << "embedding size: " << embeddings.nrow() << " x " << embeddings.ncol() << std::endl; + ++ if(config.burn_in > 0){ ++ std::cout << "burn in start" << std::endl; ++ // burn in ++ LinearLearningRate lr_init(config.lr0 / 10., config.lr1 / 10., data_size * config.burn_in); ++ for(std::size_t epoch = 0; epoch < config.burn_in; ++epoch){ ++ std::cout << "epoch " << epoch+1 << "/" << config.max_epoch << " start" << std::endl; ++ // std::cout << "random shuffle data" << std::endl; ++ std::random_shuffle(data.begin(), data.end()); ++ // single thread ++ const unsigned int thread_seed = engine(); ++ train_thread(embeddings, dict.counts(), data.begin(), data.end(), config, lr_init, 0, thread_seed); ++ } ++ ++ std::cout << "burn in end" << std::endl; ++ } ++ + // fit + LinearLearningRate lr(config.lr0, config.lr1, data_size * config.max_epoch); + std::vector > fake_pairs(config.neg_size); +diff --git a/src/poincare_embedding.cpp b/src/poincare_embedding.cpp +index 7eb7293..a67626e 100644 +--- a/src/poincare_embedding.cpp ++++ b/src/poincare_embedding.cpp +@@ -35,6 +35,8 @@ struct Arguments + real uniform_range = 0.001; + real lr0 = 0.01; + real lr1 = 0.0001; ++ real eps = 1e-6; // epsilon for numerical stability in clipping ++ std::size_t burn_in = 0; // number of epochs for burn-in initialization + }; + + Arguments parse_args(int narg, char** argv) +@@ -92,7 +94,20 @@ Arguments parse_args(int narg, char** argv) + if( x <= 0 ){ goto HELP; } + result.uniform_range = static_cast(x); + continue; +- }else if(arg == "-h" || arg == "--help"){ ++ }else if(arg == "-E" || arg == "--epsilon"){ ++ arg = argv[++i]; ++ double x = std::stod(arg); ++ if( x <= 0 ){ goto HELP; } ++ result.eps = static_cast(x); ++ continue; ++ }else if(arg == "-b" || arg == "--burn_in"){ ++ arg = argv[++i]; ++ int n = std::stoi(arg); ++ if( n < 0 ){ goto HELP; } ++ result.burn_in = static_cast(n); ++ continue; ++ } ++ else if(arg == "-h" || arg == "--help"){ + goto HELP; + } + +@@ -134,6 +149,8 @@ Arguments parse_args(int narg, char** argv) + " -u, --uniform_range : float > 0 embedding uniform initializer range\n" + " -l, --learning_rate_init : float > 0 initial learning rate\n" + " -L, --learning_rate_final : float > 0 final learning rate\n" ++ " -E, --epsilon : float > 0 epsilon for clipping vectors\n" ++ " -b, --burn_in : int >= 0 number of epochs for burn-in (0 => no burn-in)\n" + << std::endl; + exit(0); + } +@@ -159,6 +176,8 @@ int main(int narg, char** argv) + config.dim = args.dim; + config.lr0 = args.lr0; + config.lr1 = args.lr1; ++ config.eps = args.eps; ++ config.burn_in = args.burn_in; + config.initializer = UniformInitializer(-args.uniform_range, args.uniform_range); + + std::cout << "settings:" << "\n" +@@ -172,6 +191,7 @@ int main(int narg, char** argv) + << " " << "lr0 : " << config.lr0 << "\n" + << " " << "lr1 : " << config.lr1 << "\n" + << " " << "uniform_range : " << args.uniform_range << "\n" ++ << " " << "epsilon : " << args.eps << "\n" + << std::endl; + + diff --git a/docs/notebooks/poincare/poincare_numpy.patch b/docs/notebooks/poincare/poincare_numpy.patch new file mode 100644 index 0000000000..8134bea4a3 --- /dev/null +++ b/docs/notebooks/poincare/poincare_numpy.patch @@ -0,0 +1,324 @@ +diff --git a/poincare.py b/poincare.py +index ecae36e..f85bf22 100644 +--- a/poincare.py ++++ b/poincare.py +@@ -1,160 +1,169 @@ ++import argparse ++import csv + import nltk + from nltk.corpus import wordnet as wn + from math import * ++import pickle + import random ++import re + import numpy as np +-import matplotlib.pyplot as plt +-import matplotlib.lines as mlines ++import time ++from collections import defaultdict ++from smart_open import smart_open ++ + + STABILITY = 0.00001 # to avoid overflow while dividing +-network = {} # representation of network (here it is hierarchical) + +-last_level = 4 ++# network: the actual network of which node is connected to whom ++network = defaultdict(list) # representation of network (here it is hierarchical) + +-# plots the embedding of all the nodes of network +-def plotall(ii): +- fig = plt.figure() +- # plot all the nodes +- for a in emb: +- plt.plot(emb[a][0], emb[a][1], marker = 'o', color = [levelOfNode[a]/(last_level+1),levelOfNode[a]/(last_level+1),levelOfNode[a]/(last_level+1)]) +- # plot the relationship, black line means root level relationship +- # consecutive relationship lines fade out in color ++ ++def load_wordnet(wordnet_path): ++ with smart_open(wordnet_path, 'r') as f: ++ reader = csv.reader(f, delimiter='\t') ++ for row in reader: ++ assert len(row) == 2, 'Hypernym pair has more than two items' ++ network[row[0]].append(row[1]) ++ ++def main(input_file, output_file, embedding_size, num_epochs, num_negs, lr): ++ print('Creating wordnet dataset') ++ load_wordnet(input_file) ++ print('Created wordnet dataset') ++ ++ # embedding of nodes of network ++ emb = {} ++ ++ # Randomly uniform distribution + for a in network: + for b in network[a]: +- plt.plot([emb[a][0], emb[b][0]], [emb[a][1], emb[b][1]], color = [levelOfNode[a]/(last_level+1),levelOfNode[a]/(last_level+1),levelOfNode[a]/(last_level+1)]) +- # plt.show() +- fig.savefig(str(last_level) + '_' + str(ii) + '.png', dpi=fig.dpi) ++ emb[b] = np.random.uniform(low=-0.001, high=0.001, size=(embedding_size,)) ++ emb[a] = np.random.uniform(low=-0.001, high=0.001, size=(embedding_size,)) + +-# network: the actual network of which node is connected to whom +-# levelOfNode: level of the node in hierarchical data +-levelOfNode = {} +- +-# recursive function to popoulate the hyponyms of a root node in `network` +-# synset: the root node +-# last_level: the level till which we consider the hyponyms +-def get_hyponyms(synset, level): +- if (level == last_level): +- levelOfNode[str(synset)] = level +- return +- # BFS +- if not str(synset) in network: +- network[str(synset)] = [str(s) for s in synset.hyponyms()] +- levelOfNode[str(synset)] = level +- for hyponym in synset.hyponyms(): +- get_hyponyms(hyponym, level + 1) +- +-mammal = wn.synset('mammal.n.01') +-get_hyponyms(mammal, 0) +-levelOfNode[str(mammal)] = 0 +- +-# embedding of nodes of network +-emb = {} +- +-# Randomly uniform distribution +-for a in network: +- for b in network[a]: +- emb[b] = np.random.uniform(low=-0.001, high=0.001, size=(2,)) +- emb[a] = np.random.uniform(low=-0.001, high=0.001, size=(2,)) +- +-vocab = list(emb.keys()) +-random.shuffle(vocab) +- +-# the leave nodes are not connected to anything +-for a in emb: +- if not a in network: +- network[a] = [] +- +- +-# Partial derivative as given in the paper wrt theta +-def partial_der(theta, x, gamma): #eqn4 +- alpha = (1.0-np.dot(theta, theta)) +- norm_x = np.dot(x, x) +- beta = (1-norm_x) +- gamma = gamma +- return 4.0/(beta * sqrt(gamma*gamma - 1) + STABILITY)*((norm_x- 2*np.dot(theta, x)+1)/(pow(alpha,2)+STABILITY)*theta - x/(alpha + STABILITY)) +- +-lr = 0.01 +- +-# the update equation as given in the paper +-def update(emb, error_): #eqn5 +- try: +- update = lr*pow((1 - np.dot(emb,emb)), 2)*error_/4 +- emb = emb - update +- if (np.dot(emb, emb) >= 1): +- emb = emb/sqrt(np.dot(emb, emb)) - STABILITY +- return emb +- except Exception as e: +- print (e) +- +-# Distance in poincare disk model +-def dist(vec1, vec2): # eqn1 +- return 1 + 2*np.dot(vec1 - vec2, vec1 - vec2)/ \ +- ((1-np.dot(vec1, vec1))*(1-np.dot(vec2, vec2)) + STABILITY) +- +-num_negs = 5 +- +-# The plot of initialized embeddings +-plotall("init") +- +-for epoch in range(200): +- # pos2 is related to pos1 +- # negs are not related to pos1 +- for pos1 in vocab: +- if not network[pos1]: # a leaf node +- continue +- pos2 = random.choice(network[pos1]) # pos2 and pos1 are related +- dist_p_init = dist(emb[pos1], emb[pos2]) # distance between the related nodes +- if (dist_p_init > 700): # this causes overflow, so I clipped it here +- print ("got one very high") # if you have reached this zone, the training is unstable now +- dist_p_init = 700 +- elif (dist_p_init < -700): +- print ("got one very high") +- dist_p_init = -700 +- dist_p = cosh(dist_p_init) # this is the actual distance, it is always positive +- # print ("distance between related nodes", dist_p) +- negs = [] # pairs of not related nodes, the first node in the pair is `pos1` +- dist_negs_init = [] # distances without taking cosh on it (for not related nodes) +- dist_negs = [] # distances with taking cosh on it (for not related nodes) +- while (len(negs) < num_negs): +- neg1 = pos1 +- neg2 = random.choice(vocab) +- if not (neg2 in network[neg1] or neg1 in network[neg2] or neg2 == neg1): # neg2 should not be related to neg1 and vice versa +- dist_neg_init = dist(emb[neg1], emb[neg2]) +- if (dist_neg_init > 700 or dist_neg_init < -700): # already dist is good, leave it +- continue +- negs.append([neg1, neg2]) +- dist_neg = cosh(dist_neg_init) +- dist_negs_init.append(dist_neg_init) # saving it for faster computation +- dist_negs.append(dist_neg) +- # print ("distance between non related nodes", dist_neg) +- loss_den = 0.0 +- # eqn6 +- for dist_neg in dist_negs: +- loss_den += exp(-1*dist_neg) +- loss = -1*dist_p - log(loss_den + STABILITY) +- # derivative of loss wrt positive relation [d(u, v)] +- der_p = -1 +- der_negs = [] +- # derivative of loss wrt negative relation [d(u, v')] +- for dist_neg in dist_negs: +- der_negs.append(exp(-1*dist_neg)/(loss_den + STABILITY)) +- # derivative of loss wrt pos1 +- der_p_pos1 = der_p * partial_der(emb[pos1], emb[pos2], dist_p_init) +- # derivative of loss wrt pos2 +- der_p_pos2 = der_p * partial_der(emb[pos2], emb[pos1], dist_p_init) +- der_negs_final = [] +- for (der_neg, neg, dist_neg_init) in zip(der_negs, negs, dist_negs_init): +- # derivative of loss wrt second element of the pair in neg +- der_neg1 = der_neg * partial_der(emb[neg[1]], emb[neg[0]], dist_neg_init) +- # derivative of loss wrt first element of the pair in neg +- der_neg0 = der_neg * partial_der(emb[neg[0]], emb[neg[1]], dist_neg_init) +- der_negs_final.append([der_neg0, der_neg1]) +- # update embeddings now +- emb[pos1] = update(emb[pos1], -1*der_p_pos1) +- emb[pos2] = update(emb[pos2], -1*der_p_pos2) +- for (neg, der_neg) in zip(negs, der_negs_final): +- emb[neg[0]] = update(emb[neg[0]], -1*der_neg[0]) +- emb[neg[1]] = update(emb[neg[1]], -1*der_neg[1]) +- # plot the embeddings +- if ((epoch)%20 == 0): +- plotall(epoch+1) +\ No newline at end of file ++ vocab = list(emb.keys()) ++ random.shuffle(vocab) ++ ++ # the leave nodes are not connected to anything ++ for a in emb: ++ if not a in network: ++ network[a] = [] ++ ++ # Partial derivative as given in the paper wrt theta ++ def partial_der(theta, x, gamma): #eqn4 ++ alpha = (1.0-np.dot(theta, theta)) ++ norm_x = np.dot(x, x) ++ beta = (1-norm_x) ++ gamma = gamma ++ return 4.0/(beta * sqrt(gamma*gamma - 1) + STABILITY)*((norm_x- 2*np.dot(theta, x)+1)/(pow(alpha,2)+STABILITY)*theta - x/(alpha + STABILITY)) ++ ++ # the update equation as given in the paper ++ def update(emb, error_): #eqn5 ++ try: ++ update = lr*pow((1 - np.dot(emb,emb)), 2)*error_/4 ++ emb = emb - update ++ if (np.dot(emb, emb) >= 1): ++ emb = emb/sqrt(np.dot(emb, emb)) - STABILITY ++ return emb ++ except Exception as e: ++ print (e) ++ ++ # Distance in poincare disk model ++ def dist(vec1, vec2): # eqn1 ++ return 1 + 2*np.dot(vec1 - vec2, vec1 - vec2)/ \ ++ ((1-np.dot(vec1, vec1))*(1-np.dot(vec2, vec2)) + STABILITY) ++ ++ ++ # The plot of initialized embeddings ++ # plotall("init") ++ ++ last_time = time.time() ++ for epoch in range(num_epochs): ++ # pos2 is related to pos1 ++ # negs are not related to pos1 ++ for pos1 in vocab: ++ if not network[pos1]: # a leaf node ++ continue ++ pos2 = random.choice(network[pos1]) # pos2 and pos1 are related ++ dist_p_init = dist(emb[pos1], emb[pos2]) # distance between the related nodes ++ if (dist_p_init > 700): # this causes overflow, so I clipped it here ++ print ("got one very high") # if you have reached this zone, the training is unstable now ++ dist_p_init = 700 ++ elif (dist_p_init < -700): ++ print ("got one very high") ++ dist_p_init = -700 ++ dist_p = cosh(dist_p_init) # this is the actual distance, it is always positive ++ # print ("distance between related nodes", dist_p) ++ negs = [] # pairs of not related nodes, the first node in the pair is `pos1` ++ dist_negs_init = [] # distances without taking cosh on it (for not related nodes) ++ dist_negs = [] # distances with taking cosh on it (for not related nodes) ++ while (len(negs) < num_negs): ++ neg1 = pos1 ++ neg2 = random.choice(vocab) ++ if not (neg2 in network[neg1] or neg1 in network[neg2] or neg2 == neg1): # neg2 should not be related to neg1 and vice versa ++ dist_neg_init = dist(emb[neg1], emb[neg2]) ++ if (dist_neg_init > 700 or dist_neg_init < -700): # already dist is good, leave it ++ continue ++ negs.append([neg1, neg2]) ++ dist_neg = cosh(dist_neg_init) ++ dist_negs_init.append(dist_neg_init) # saving it for faster computation ++ dist_negs.append(dist_neg) ++ # print ("distance between non related nodes", dist_neg) ++ loss_den = 0.0 ++ # eqn6 ++ for dist_neg in dist_negs: ++ loss_den += exp(-1*dist_neg) ++ loss = -1*dist_p - log(loss_den + STABILITY) ++ # derivative of loss wrt positive relation [d(u, v)] ++ der_p = -1 ++ der_negs = [] ++ # derivative of loss wrt negative relation [d(u, v')] ++ for dist_neg in dist_negs: ++ der_negs.append(exp(-1*dist_neg)/(loss_den + STABILITY)) ++ # derivative of loss wrt pos1 ++ der_p_pos1 = der_p * partial_der(emb[pos1], emb[pos2], dist_p_init) ++ # derivative of loss wrt pos2 ++ der_p_pos2 = der_p * partial_der(emb[pos2], emb[pos1], dist_p_init) ++ der_negs_final = [] ++ for (der_neg, neg, dist_neg_init) in zip(der_negs, negs, dist_negs_init): ++ # derivative of loss wrt second element of the pair in neg ++ der_neg1 = der_neg * partial_der(emb[neg[1]], emb[neg[0]], dist_neg_init) ++ # derivative of loss wrt first element of the pair in neg ++ der_neg0 = der_neg * partial_der(emb[neg[0]], emb[neg[1]], dist_neg_init) ++ der_negs_final.append([der_neg0, der_neg1]) ++ # update embeddings now ++ emb[pos1] = update(emb[pos1], -1*der_p_pos1) ++ emb[pos2] = update(emb[pos2], -1*der_p_pos2) ++ for (neg, der_neg) in zip(negs, der_negs_final): ++ emb[neg[0]] = update(emb[neg[0]], -1*der_neg[0]) ++ emb[neg[1]] = update(emb[neg[1]], -1*der_neg[1]) ++ print('Epoch #%d, time taken: %.2f seconds' % (epoch + 1, time.time() - last_time)) ++ last_time = time.time() ++ pickle.dump(emb, open(output_file, 'wb')) ++ ++ ++if __name__ == "__main__": ++ # check and process cmdline input ++ parser = argparse.ArgumentParser() ++ parser.add_argument( ++ '-i', '--input-file', required=True, ++ help="Input tsv file containing relation pairs") ++ parser.add_argument( ++ '-o', '--output-file', required=True, ++ help="Where to save the trained model") ++ parser.add_argument( ++ '-d', '--dimensions', required=True, type=int, ++ help="Dimensionality of the trained vectors") ++ parser.add_argument( ++ '-e', '--epochs', required=True, type=int, ++ help="Number of epochs to train the model for") ++ parser.add_argument( ++ '-l', '--learning-rate', required=True, type=float, ++ help="Learning rate to use for training the model") ++ parser.add_argument( ++ '-n', '--num-negative', required=True, type=int, ++ help="Number of negative samples to use for each node") ++ args = parser.parse_args() ++ ++ main( ++ args.input_file, args.output_file, args.dimensions, ++ args.epochs, args.num_negative, args.learning_rate, ++ ) +\ No newline at end of file diff --git a/docs/notebooks/poincare/reconstruction_eval.png b/docs/notebooks/poincare/reconstruction_eval.png new file mode 100644 index 0000000000000000000000000000000000000000..4532a18cab07fd6fcb659378ea7068a88cbb5d03 GIT binary patch literal 201202 zcmdqJWmJ@FA3jPA-AFe`cXte_h=c-y^dQ|S-7z#ODgx3VN{+x#(nAOml0$=(N{fUH zaUOhM_v_yK?^)-=S?9x9iw~@4c<#CDSJ!p@h}YB6B*Le|M?*s+x_LwG4jLK=f`*29 z4;LGF(pJGajE2U7c2f;(;BT=tFJ#8HxCq)ixW@mu+RB8S>gJQ8J}M*&Hmn^RcHQGXC}1uQ!yMG7=Ic{S)Kq=+m{Q5z`F5*`vF<2tW?cD?ocRH^f(TN< z8jwM{9euqgrFYj}PKeI3^I9~uB?&LGHKF5nHqX{Fo-~IDZWdQe@e^^3m0(?3j^ga_ z<4yGI8}8SG2@2&!Q`P^qxfwJOQdltZf=b_PDyCt5v9hR+TEgCE)WlEx_;oCvsa@k$ zHcVJv(u>}^Pijg<*7n|d@>8tqD!L^l#ELQ}otSS{hyROsxF5P*4LWnl3zDw=bBvjn z&T8fd3a17dohVA27zwqzEx&)pUpNc#MVq zws7U^jVNQ~dauaM@WwAv;Vgc7HU+eZ^&~#zeG!$rWqIiXY@Vj=EukPT7}^KsXALBU z&t;EIk{V%w@=-09Y#vFDpXKpf4d(9xi+DqV8xD3+xe6^!y_VGQ>J*tt%TxHj9GfA%z$2jFhKMupq+_i`9>a+JIWu zP(kS6rk#EnK2kT@sw^&Zg&MJ5@zUtd2coHcM(vLLz2%)q~)f_S-4fJ&DU2+ zX7bTv#@@{)jNb_``03^L;0nzz_f7ZM?RRk_o=zM07cPD~qJ+%Hs9NGd#uUZ;n4RAH zeN=iq_NFq~Nv@iV*DlC?!FS6^B)MjU)=drXX(o1HA+63Xv6;&8wJy<5IquTw_4`4V zsV84(-MYyiBvWA@5T`^+KCQWzg?cS%|BlMWql#&za-wpbut6*9$I`5^nye4hLq+X% zNleGv7+2P0<~UagNLDdkKcCKrS1YAID#>7coWoc!FQ)iCo`QNdElOonceL#>aqv-0 z+>5^RWIW22d4}A1Fn{J6^Uf68jnml#xl)IfF8u*E$SZrOy*Ky!a3l9ftHpNs?A+w= z_6i*P^Y=sNk$Tst{B1fHGgBjm?Ll_W!1(g(s)b@5J19_Yv3K@UF@1*I?ngZ7dR_cJ zu^?PN)4j&%^;BWDNJ)|lgFw{hsV4jTWwiA&(OX&2tdumo`%DkBkGkGvMHLo`$9!89 z{T45lZC=8vML906h4++0y1u1ah}$tF%(Wa zA~DSY%#haJG^Y`8IsclTo>4Dv&$7}DaGNJaRpTQaN4vK62H|7Uk=L$;Us(;GrJ?SD zi2@M8y?vQ*GC!$x8fUvhVZjelDFUySEf>|_G(jor86)9PpDprw4ope54fA4_%m^b- zvcytl=lMw05imQohj&?r(MWM1dbM_YB(n+M(34Oau~1}akw=wDPt^llIOHBrTtvOT z2IuF_R3%ZWDfp5wdQ28U(KkbboegH{O(zhHeq+zbZ~3{ThoR8Z5q4!rMC{@ z6U*(7(bL{~BJQeZ96@m9=s;Abv=nbnPhYUWGx6GwRIFq4h5Q zBfC69$|&RGIjc~vSm>rFsNAbFY66qil!R~b-lL1BPqx;=}9SdLU+I zPjO5*?>B4eR?G1vm!sUbjy657;NBl=PLsY#C%M)=8So@&W$aH4*~5=&>b;mqnpKQ6 z=E0vj<>8$iVh#@H?O&r?Uzbh%_Qu)fK+W=gxijtpujcfM9dA#CnV_oNl*~Y*#1Wi% zXCVA*t6LRWvu|ozZ(@T>$3?)NNc%2I?F8fhcw7ol0Us5I?-=Dft|ts7aeBhkwKfMm z;pdy|#-m+}~Fya4-lPhz`kYMvZk#WoV-DlN9v zCCJ3G+0Y|&hN#E1x^&0#+g_UG<_f7ke-|b3SS@e+^?5KdVwYM>Aqv?*eW*TsM+NI% zsKTcmLxw51C*@r`M@2!w60FCkaGf{Be%5lOwdcYkXS$RT&)&4UVZ$K3J#?R`1U%ff z+t2j^3sWVH#P()GSp?qQc_Kp{9dbajK3iEAC{`rQut`0#W5)i~Df;lxna`%;NPkBis0T63;b=; zONBKuBie2s2K(3eA5dgit`)QyqK_@;L+zZ0>1bx1o3uRr72^7g!cETEv^m+MZE+aj zF)1-^ilWe%e#xW7FG3&~d1s2RnZxWYMe&q0f@xTQOzQb1Tj_K4ic5vb85gXy-IFpL zSt(LB%?vz${e6z5zVa^1+1^Kj(S!8)GKoHWt}a+MbzC)qYtcBCBr|q4is_sV@(We( z+|D6Pn)hbY-fe?jY&?Oh9zV>*e>(Icum7@*XXNYhJR!up6FX9eLa##k%saN>L9`Hg z>`MNVQwN)=0HvvcWMT8@I+Vz%9S@n~8qBEdt8-bV>iA0cmw5&8CLv+LOe=DJ4{3fz z342r5JJeopXzRa58H-p&an%{;4!Yjmw~20&lpOvXLkm;g-#I2X5^*cLLubFteFuVG zj5-SX?h;ZiUrt*JugU^%*>pQAOtOib#B78aY#!G(DEu?R=~<0}7MKwILvT?HQPBwB zvm5lVs_~NYxX3{kxK+o+qZ)gb(g}L&4Ch-n->9#SniO>tB3!5*7SnxqCPSQ6fWk9t zj+&@9dAXK;9KpMrm}K?T{q+}()ag;o*Sc^a4?P&~Iu*CBR5495V$9B#zAUK@ri?NF z-bqEhl$H9ax*=vWP+_tj8#Y|O-^gObYSnBHfEyNXY3S>c+s z8wq6M$d?Z~A!Kve7ZbS{H84Y`0}0J|(f#JDq?_75%ZV`|;XD?24jjmRlluE*D$hzz zSNZ{S@9FuZ6B0%%#J1zRtS7$md3S~Vr~*{Pc2kKd$Jl)`N)1IgYqTigY?hfK>R{<` zesijo%Hlf%LCY-ivYJ-K5hDN%%nu~ElB{%CbJT51H+Yisqyu(@-ANy1DS<^DdI%Sc zGnZl{jh-k5Z#Road?Rd1svRc2Y+>Y^xOMhLKQoVvsq7?ZEaNk5(VlAaPQMT`EJ2u= zgS3{Ly3fWj^4_d;`6$-Bl9%|b;Bgb2NvAF$csy!wjNEAG$=<`Yx$Xw~vbgqzFnwv+ zfyZ#`*LaYF!%>RovFv9=CNoqY?{@xx^d_yh-l8aVvZ-klnt*QCi+5zbv!rdVN}BB{ zpT}U>z#E_9cfP3WC*@8|Q}_T4@hY`HZEDddcSoNv!>t^=HEyIsN{}I!ni#npLAIV-{<6{RZN(!5`sbYZ$ui5QuF6gB#-Pz z+3H-k!ios3VU-bBunJH*+Tf_r^)5+=P4p$fJI8gzyHWy^hj-|o(&m=MrJWj=-{QHQ zcV;MtUVd={v*x(;L%kCMPIaveB0wJUt*`d2KiPUFfmvPh%c-8|H?5(ZP<2B!kNGJ2 z`IT~HY+hCmBh#BU%?u0#v z9BYp3HX*Vj#Na2Gzk6_1$nE0{AQ#|Wr4wlPF|o#i#XPk)j!`(-%^u_RW9gLJ|WI3y|`R&H%{Coms?Hn%PB=|rtrhLJf@E;0Di+d{$A z@?j77D_uLRG4Q3H-&nH+GTmI0^0GSKyDMZz1LSBcHlzf_4DBU2&mR-t;?ptKzHh(> zy7rc~XuvLdr4`;ia;*?JNUh$DNMl=K7X|+ctF=`+bldK_&>3Ux&iWq|^@i-_DU|%Q zwP_q=uMI%Nw)sVNlicd_9xti#O#M1tMe;J6JGz<4CW=GMVzwR3@tmTJiwAe2iH({; zoag*{WMpk8QF4QHZ1+NO=Os)`^GmBETwkHR^l}``vJ$P0%m3Qr+Je33iGFI!#bC#% z^+HBr)ZxDBj#44yki4{u`eaXV>(^K1!|9dv^zW zm*j>zYbj!z6<5>WQgPPm*pC27lgX@IRg!6OaPKL)+PrACAVE?lJ|gSZg8@2&i}wz> zWMxfNxmd7%A-3di^v{ot7|cQXx!(ts{%xgPR5UK6iENM^Uxr(^q_v_mE#D3Fbq{+` zHOCmgL8D{*9;=RPgkwhR?d_S%`z@Yy=o8yc5jpR1d-)LB6JN|$SJNpBWy95#P=;(< z{j|Chw(|CRh1A5|IRB&lFA#F@C6C(<9XP>FAo9U+t%B{kgHR zUnQTXl-`R(20G4&52@HUyroFjHqpevEfs3(Ek1|Bitt5*J3P{7Op2!^L{m z)s3%>g`JvYSv*st(ud@8tFrMzuVy&ni)fW4VD)OulTh4O`Lu;WMCtv(S8tT zZAJ#MY(f_^8gfoIUZo&NKB;FQ<5osa9*3S?vcuxs+Wug%bK#SKnUc3IQ{BCOgH;N9 z>1J)!bgfcHAK{E=%X3Gats^h-TSqlS(6TnLpXQiXM${F4e{a=dnDRDd(1O0+RwSWo z#I_J#CCXH8x+f67cXk8pz;`>ZsVWErJLHG!7c4Ez97fHU>LgU<{|kQ9ZfK{EMB*vg zNap_2d;FErwL?KPh!mRaxWa$E{$DUvF&8ZgIXtx?Z}YDk_1{;l5Ez6IO~Ror{eQ!+ z|AAO@b;H418=KxaBLB*3{`-nB1RWd3j=iz`*UbJgpNL_uc9x@qLz&?};c!t}U2%F~)y zEO$8dZ>x%UM6f4z()T_<`PWJmpDI(X1*20|kP#e2-I8BqL?nRe3c6C{3l7apID1E^F z>tV1FaHzR;8vzTyo?QLeXHqND0d(+R+ZD?rEC_Zn)PS)`4cErby~a^GFv^b37IvV! zEdMxUqa&wHxRdq!Hssz2&+Smsw?8o8`R~b|kfJvx6_`0QG;y+iMMccUSVCR0Mv~<7 zCk9nfDUV_2&pAmks{`Eh0>G;SJ(QmodJ|w1USv<#1K!b$!*e}CR2kPd0<+BxH5%Dg zJfGkHyk4h3MNp<9Xf%?Lj80VB)R<$nve@G&OKo-5GTqa|aq*$MTW#ks`P z?P0pgAr77#y_5HSyWhTxPH z>WErw^vHY(4mdQ!nX)&gSL5r;wnuvc@{YcO4|>;azw9qk1IfIvb!*T-67w@=p1Jx9 z^O|VO_rfmoH6B31Zb_0B;(yL>q%(?}(fm*v-8H+!y93L=COJ8Awb6M~%p!_`LMS!< zW`m~Z+$1V(x5G6TUD0Fin^@{73B_6C7W)E4&ytvQuR!niNwCn$aXhtBS=bVa{v=>C zX4sUWo}u0*J!)U^aHp;0UNh`!UAbWDUMzYUdM_35kEHfISosvMB zML$e!-Zj+!V5{$tr7}x9uDDaZ68$u6k{0$LGfZ}@E?aZGk`i0WZb&fmc195S_OnL= zb9I9~A;d1^Gt##=MDZ3}Y*uc6d*Qr!_vg%0@U+_%5?0^~F~KBmm(_coE6;KRzPgJJ z2dAx_AFZKWZ3x2<_8uvwDYIO|yrIY-zFi86%SIP+MLFVk$yd|Y9cxYvazAev?l`GF zCRVO{7*d^bD;e1uh2;9eeHrolO}yqG*S-nflJgsS{+IDY=n4UjYK#OO<99YnnGCq} zp1&Ls8VI=bCEzV#-501ox)E++B8=TiGC3k#d7NKH_;2snbq#P7+U9?^kl)QM4-E|) z#(@3zN56Zf*eiF{*FN{}n)5Gz01SZn|MLO%c36xEkxM+%R|J;uYLD0P-xu6Iyu<*y zmSKS|v)nxug%7WScpM*cG$$18@`Wx;W=hvo=M<5Nr_Q`dYS^GBE|Y6WX%bfY+C_5W ze+LB|4?7uO`2;vs*!3cCE+i=Suxa`>?Ejct!>BLpEgb zr&OD`*&Gg*bU`O?J!2Z`t5$2d_5dPA`FApG2tazjf7%@8r~6omT_dYNg(a75s$)zj zHcUv04SVOstsLP9_+UArmOk&_iPQFGAQx!ON|Vb|4#NOog_4i$4IwcOeDQ-I>*Kk+ zJ7r)cZ17gs%{7&3cTOuhJ<_szw=U~+ecn0NmsI+ZWJ4ZUiV=6!Q1mzEGBK`YFaXZ~ z$=E#?p1)l-Zs4*(8|EZHfq3IlNOA33*iZ?%N_OH8=zXB=y=O_n58PRGT}k;MU$~>v zit+CLCw0%1P^&y6&B>w}cyv|QTNMB^)$uuo?f-sAH0eP60pIjex~9jYM*^v--f~x# zeHU{si_vRF%-T%-R6uAoO7+@o6!J~98h7;P3Mh~O9(PA`Oc4jCfP98n1=tv6)udSq z48}UGraR$jJ*i!abbd&*65x6RKbGz74CGXcl;7r`6hv_8s(X-ZZjXY)T-HDvS#)#Tizxpv?V~H zi1~e@r$xQ?Np)-ny>lkOZ7l6?VVG4v^flJ{*6gn3wP#(O{fiW#qTjNbc5xurd0Dcs z+Nd3^%m-D7Z}(sCtT?A5TLEn?umy_{d@93n1-p>pRT1D!)8abQ8;hXFjB|XN#@Ch; zQ8TM}p!XjJV?9^P{g)QtC!3)MZ*ElPwNzgVZS{r;@?fW;Xk_L^8Hfpz#3-Th+-~>> zNX68SmXTuVRTe4;spK&82iY+89cQL@_cdDgNRB0F-;W4hIOGsONFIq*wr`BEQMN`K zkAXd0I_}?Q`Ti=lB2K;k!JlZLigq|{X1^>AhzmYFcKs&J zV^5G^@`EI#w28Y6s8kX_J<{1yH+kaTJIkMZm?BsC3?( z#UmrKWL_^mhr*(q89HL}(nEkY?-5^LJkQ)9iu8cUts^hKVF!5wKe!aQr6g+`9lw&7 zD-#qJ1XAeUVlHHgF8c^RgnbIxA5g1qT@6NDGzbeR>ghKH#dZ zTl9LqPk6G4_MxA!55ll>sG45R)j*t~pL@+@kbUbkB{8fA&SGS8=0q8%&Zh%G&oHI1 zDwDyQl6oY{#7g$oXQ-CZkCab+`My%j0|gaMbwnk2#=Xm} zCkepD*Y9I2RK<-joU8YVM!lgyG;LrXFfP}T8w6Gdvebj%fVZ&ges8$f@k+$`USi8- z`t(3D{OJl)uw1&F>drlE*fl?^bFbEiq(HGsUlT)c3)Mh8n8c zci!AUwLei4(d9z$IpM+xtLZ##-?=ELWPLUlj~Q0@9qtz zmwb9OrP?cgwr*~4bfJn+yjRuM9AMLaaY$CaJweUu>2H)OQnQF8c6i1qyv0rnSHc>d zs3oy{$RQot`!TbYkE^Bn`~w)7_^HqOv(v*}@Wma{GI-U;@0~-3D=O}2h&-a4adMqe z^o*>yVJ!ZWN1|48nYzo!DiLs!?Q@gWla`kDg?1cawQ zC96|xH?PMnCc|uxnCz;{Qa?MTkE~G0|8TNN5c(pE^?}HG&sWdwn^t^W@+W~KlFnkx zk>@Cm`)gXcCr;(k{a7DGgnW_Ut!6t!Y`)x0b_Z-PRyj$r$@QcWJJL-Q30W`Ue{p_d zt`&eZcPsv&TBhMLwKZ4EygtvsFu2s*TIfWqpGy7e;ql1l*7gR6$eY#U0}3=bCO%um zEJm&X*q?CyyF8=HULwfRsjjSEuGEH);SohL~Af1CNWpoyuR>{LP{2Tn(q*u z*5N`fjzHatU+VhCO4|E?S}!Fj6Q|&J$0~g#DB4)Co-MhP#|Pb(?yY1o+FtoOQAA>i z0#Hl-uiy2&k0{qplaSKdgVXiy+fSTE6RVWe`5A3VowB@UrF+@RHE&`G%-_9%Mu3y#0b_YE@XccL+3Fi*ZXydd4H!N z0JDw@PI8!de3!$$<-Pp6r_o4Xa7tKe>ZyU^-6yq{xjA4L5%k4%bTfCR(3n*`ZdV1- zyZ5?6lID`o%Es`)I0i)w2p_t}7?x43j)@c{Jdt{W-p6=4yZBW05*Z@6)%-q14OOF3 zkx2gUldjT9qFOO>MPqDQCy{l9+-K{(XbsuJ%Zn{{#tbz?YZH|wB+kCg<}v7tp+G$` zG9S2?52PfD@zU=-eMIa6Io62voKB%kBoliZefARSg6+{$;4yeijo=jvn8#x*_ao3g zHOXUR3*E)KsIh`4|3M zoV$CcA<169hGCi4;R`=_--*Nv6JKv>8?d59x88ey)iGCTRswK$b@c7O8E~rRRk0Yo zD9zMl^GW*bN_?5F{=7BA%G0%LL)aJFae{61RU9st+F6;Sb*)PWSJARexx5LYjJMd6 zDus=MD(^wGYzsOzKv`t#Aa5&RO#T-w)YAK;KYt(Vy~SNc%g+%;q_f7Nx1vm5G7&_A zoJ~!ueaqbpHRjHV;vNofeQ21^=vV~6@vX8Xvok__m?^YaO95+wo{H6&(L?6LAP7GG zoHNbaGkS=;kMept?{UAAu`s@o%a3=$Q>yblmWo^L$BALX*-7E&ZDjK0jm0HZhBz?8 zRSMSZZuPmF9OGG~V(ky+!`)|(wjv=M=ToK{v)Et zEsPuSa0<$(#@;~k=fZOAsw~V5dcL9Y7gF=P+XYJ5q!_^RV4txiBmY(t|5j3D*j<_7 zT(i8?pT5V6|H?h8OI4HoTEOqiyDC82#Q|UWa(!W~@sIGL4J$BJ{-%iJ-@f|qzm}K) z+bMo5IQ(ln|FtF>0${2(ABkMBem{oaS1dgEcf@Uszx%g6wh?R}wzXLRW4bV*0>d+y z-kz;T_D7IHHlv+|5hyY7I}AgvJDfHZzui*>3gS3}1NAK4&bkRU;L9{PtrC z+CpJT2WlQ%PE*_Ay@4?NK-A@+?l1not&5OE4;4hocSVFKEQgr?EHCEuvB3k;xdR3g zmMY_QDJP#~$V0~rUQQ!&wP$b+b`*{-G^{pKsaM8czI&eBAmpD)Cvf8Njuw#urw;hv z$im|2vEHhMjLnQSRlSwBPMt}+5-;9qzz;oIeNxMRj0FQa-IeL)t064^-x~r&0x1(s zpll4-kyzDHIC)Y3>H2CkcIyn$4$fkqEpiaIN*shG#MADG5^{DqEP_JybA=P_N{? zW<~n@VP4O6*D(~&f0qV{GNtuAmSR|F+2hcvNh;LFCE>97(R%m^HJR6{yLy$&o*b+6 zey*mv*(p>j`9pgJo@_fl6()hVIF;MrIzX1=^SCAJ=wCg&(CDn+E2?WuW6XM9+#6;&ccnl5u_GWBY7FSu7Ed1zl8171Rr?Ni zKBd?TRZu=!KCCg8xyf#|v#^X+d$lhVOM{YU zEhZb1n!I{jTTsK+AHzszebfGrAm&aJOwq+;h~0Y%KZ+jjsGxCMbzmj7&vs|VZpE)9 zUeQGg&y`>IW21JY)GYGUw{+uQpt8!r#E8~C_K?LeopKx3=7PJi3qpqWwlVq~n+ODnd=!Tc(#KJijj2#z(a=&KzKV+VJqz!;KT`p0pd_8x=Llkn( z3z`g_IteD^R$`+l^e7O-I}USqnK5`Hk%~t>w{bWC1IoK@xD$8G{ZtQg#zlI85P~zV zF!w*b=7|H~Xqe|Q3*{71fj*O}GUQ!}`PHpqueyGWo?rNRk^nI-Co25-E!i=_u6`ki zIpw$+;1t;Q9R3s@&_JA5 zfne7un>1MbTS4)+U;jVb5P*Q{4kyZqq_`&{MM&ZI%|-A(vC}FIgSHK%q{atmXrf#F z_TgI)TA##ydS?Alyi#))IJ`kw$-1m3m2xUG{=6O2~reYu@3 zRUfV^AVeKqwp{%&4dS>0kmv*P8~y2h%5F7W9H|3fsbc5^p>uOmf!bmOFBi}{J|SXf zV`Jip{c-3K{r~F%c#3`zk)Jhl%e|mWMh35Ho9nFv(X&tvGI$;K8$kAxGCv!njO+>{ z!&&&oXr`s{s8!0koAuq7Lj}|lW-mhRxNZjh{Nt=GM)g?(_(10rNjE5(BFg%XPs!H* zW6i_FFWiE6*$`&LF{29A4RMzREtNk+5lE5F=d{;&B^-!udAI?DP3XXUehbf)NqtoP z5z;Hf{=5OPcAKj4UGyEIkuMUc5WWDx-56o^mr%oUWaK;hd-RfRz3E}zT=J!+YP$+ zsqCj2SbYG|fn7j!$xK5B((eYZ8znR?$v)95bL?e-hNv0L)P=sG2e9VuZ?Tx11}v1K zH|#I-OX}JDnWEQP77csfElx;Q(RkY&`eO&(745Ps=xVeh5BzAgwdn#A>Fz+e}H>XCs9c=5u&lPw|y*A^X-Q@C!&zo*6(Fk)6J}KV)DBU zpmMOYWA`9S=iKbeb<4`*oeragnay2FHdTOFIoO9H>lOL;0b*$^q8+zSHz<8Pa(b7< zTDXiMq^Kg(EG0AQHe6wX#1UuP8(*%uT~1idL6_#7JEQz%@D`7A8@kzyvW;jG>Ko43 z3z}+Ejgcuo9wyNO>N*gNj^7<=?bN3J<@r*rfcz0b0yM}>`dXdweQzsA3l-kLsAgKe zl*-8JcN;jTjt$S(RI9^MRWBfjPHj90I?yTL1nhp`#hqc+2a9U&?4ql$x0hn_#)#jU zCKvByDj?IG4ch!3C}oV<68wF{cBg)keNOpc*(iUSBfpWAWQ7abK_zgFcPsaPXpY;ZV`z z>^2$;MXHEu&+xy!j|~&B#D=*uIexV?zQW{*KPwchw2zTmls-3TDF&p#Vp4Im;Z>JK#IXitt~-S;wDbo7y9ACwWhcP^3WgBv%cMRM}w|pL=4?17OvT z2KfC?6q7`p{vI@FQU8G#-Hz>qXo7^mdYu?|ufmBR^2BXKf!(N%eOF&-?jVtLj4~LO zF_WY7_z_;i-bzXA(Jlz39fb|rHI)}rh#-t}cZ;@0O(mHR_1f&K{tT%QDW|U5=y9mEXQV z+U+HQUA`EcyBcbq5^O6td+LpV~Vk`un<7rIU*vq3(tGQAGL@w5DiQWQw6{ zqoBBKDq8fnBpj$Kka$>DLA?)Ii#sS7ha{qq1vbp<+PK{nSSpf4qoMRFHHy+Z#2z!0 zh*nuQX05dEO+k)U3jHj|{osJI@9J3AtWkT@L~kDxIvkS1Re%l$#-dPd?#1iZi-w0t zZ`*zisrdK>R=wIj2`8AZe;T?2qnMvM&;G3Gh9X5+bfAh8-uMxFyAMB-9ezO9nV5ex zcmQ_!DfD(}iN5(cKl&!+i+0}7q9omg#Zza_DC0VdpGhvA%bA;kYtdO>OUl?+jg2Qb zKe?V#pO*SJ3OdemfbHVI+8(3hPVm~*dXF46XvPETim>m<#+1%OVSz@GNg+G6h7?c1=z3U|$T8)kd7NO1;z8U&z*5^iPcs{|Z#Q*ZjB!&b+0IKYbVw%|jq`Dj!6d zrNoSov@^$`zvo%2yXp+$-Yr87u^6duaJLDwuGBAU2BHT|4R+VOxp~rhq2~7mH%#>z zoY^cZ#L<6~f+(3v1RBB#HJk)HoCA8Y`|#@e4F^8Mk+Wn9YX2sPa83rcTlzJW68k0zLnfEE|F;ZESJ_yA69J1l9B@@M8M48|Yd;{>a>Qv?2m^jZPPxWV@G|I?Qu8G)bST%-MBxTCOYeCF=YY?(!6+ zO2v1b7yGc#Bstev9CHq2-7XvZS?7c*=_>;bJt};;D8F60N0r54ag2a-d4`V)BZE29 zr+U8uL>yhOleWufGIimHOn4IvDw|mig*5z&1l!y(NrI~t*~_BPu1Zp z^)0I`73{*i0{=m2VVjKXIl1$d-mSMlDAn7xw+dj(bo^m~X;IbGs>qLu@B!`t?~EW# z^VayC&6@!vWU70JH^!n_dAT6oPeg+5YU$zw$ToamdBc%op4%q=ACG^uokng%Ay1KQ zBICQyRr)c9UnD)3ebHIl)V!pVZY72pzqT zb<>>^{W)`iBgsYwXij?4Gl9sAN0;NZZ2MR;4MI`ky=IH_(=o{W*>(A*|7Fc z#E_5cB-0MLKb+Ku>f_UDldQ&5UsQ|Ug?kG4hAui$*+kF&EKl0i@Z_;!thhWvM!Fmhwv3XM1s*s1ZGWgI-3Oy!6>OG+62_B~ggJuL#_7?ZDz%6FI?!5p9#3+Er){WX9y`hg)Q%tr_%ajtQOxzyY13_Oxb%q zHR6a3``N)mDJE)w1uH0awp2&Vmr0i^gq*oqfn5Y~QR~bfb}!>@1P$Ww5cZyeYUQS& zlesu90AVMOjY`m35s}18S=_g?Lcs@IfOHbhBDqt+`rw$&5VQJPr>}Bq!=?yy;wZ%R zwRw4&NbA=+F80BhCqlm6iC`D+<@`v>N1N?Wrgz;pmwWF4*=5`Ds?y%!S`o=&*n-MR z@M)Kh?st7;-SJ)^Au{Wr3|}9L&-H~RD8)^p4 zLBU&_R_fQ^2{No|BNJox_arToI_d%mrvp;>;-G_vcdvcd$+nbXapUD6Nbe>Oakt=q z1iYe9D8D~eTF28B_*ktv$3Y?tZPIP!tC_M(2t}AyA`qF{eHv2+Z<*hFk0H_PIBVCx zV+#bauUF~2Js}T4RzP*Y{m8Y?QjsKOc)ImcKtFR2ZvD@)Ga{Y>;2B-LFmfg^p*@Ud ze5v76n`Cv7#(37fvVygPm(Fry8jQ68TbI-kAv$>XT0be@-^6!`s9iL3W()tN1xPaY zT+0^+v#&M>Ex0%`hh^2cn9?T)YPeXsmamf@`g;aGBuU;ONJ`|)z`E7)T^V(^DOu>& z!^4^8c>+fHZvS$!Aj(aC_Yry>by8E0CHdt|+_5LERVM+*NU4et5?-h))@!!%d0T>2 ztaotC8+;W_H5GI)&AwV{uG=WQD9CFTrL2u zI1F(;q(&@MsHGXyL@r((u4LRDAfz~$rWaHRhWM=jM&3ahJYu1S<-#=gIk)xR_ldkK z-!A*mkiIO7Y%}8#3)LH8e1ef$r(Q3Oa^B^7*Xsb=wA_Mjlv1!)&$OxMH>t=z*#?E^ zsHtyH zXPC7|d}BKN_E~`I9C`L4){i~XyXy6Jyv*T>A9)Kc0_Y`J>G_XGcLb=>t)!%2*{H`0 zgaeUq6PgPFa5)jqo#PMFfMA~1SrZ-UtGgzCACpR!z(CTuf!JNcyKkDs{5= z3|4P(Gje&3091*#{u~60VY1~9)Di(0Ty*g_CGs^a`fYLcq^JZMXT*_QQEXd?&3fiW zEtd5qL;lVkm2xt2x4LAprG&JZ82$Z>L`|{lo3fp%Vj~;lx7f*&t|=NM7$Uz zHz{F<1#S~H#Bu}^kC^d9kpcZ)j*-2Y_U-{PwRL-@ zmO&0K^0v#}^jH=F?+?IR1ALF^tHUbfTfR+F!Nfbfy^=xX>NI|A(w+jfgJ#YxDk`-m z1V<0&P{xtUuk+gillt#(zE7(^Bm&xgd(e zryH86AgawkZkhH`tYM5}GQ?0F&?zP6mW5M3a)83 z;=OexpztiY`=gUL;W6RM{18vDazfCO;x&=BkQiiQ8C9zn4e$rV5LT|`n#*Wpt6sX7 zuJNM!%t)(ML4V~AG70P=ROcldeme~Rz9tP>?#Rj6$VwILelXDxP-kiyKwy5UPqpJSXQ~)U)eh#$1f3xj>Inv=&-#%`v!myvH)G$`g>b16OoOELdYw6T8 zs{i>~AdyKSJXT9EM$H;8-yulASOQ#5$a7Cw-J}7JHakF&#pIaOM||Dg;VQR(S`{;B zk_z+|NgN1Ep*Sg9)QpU%DC6Y?c}MBm2h-qeE>^QV<1KXuoEi5y*jL%SV#vS74gIf4 z=Dix`%a75MC3nV&rX10mY`NyBFyA!No1KyAn>(2rHq{wZ+anZPV!l%#T9;>dx#W!% z`nnp{V`dBDu*EW@@JP<59MTe4;He_|mUzhD(s;VY@U7c)NUgjUZI8BN18mrN!eMiZ z=#zyQZmf)C?9aZ+#Ul-=lda{f42P=znrVuzHGQWOA#SL*8SS?#?^vqKF}8HP^uyDM zLo04d?f4X196DRY#=L-7kHI>BOF>*i^>Cm24v6up;}hhooA=!f6A%{*-XV0G64|N6 zn9ROqE;c1DY;0c5?X1rmwst*uG3*mnKir6h*U`+vj#X%zooYv6^Y%8J$>L!>8I`;$hklXAv+ihrB4Qk8bEq?#iaRMa;!7ix)qj)DT6f*%sw*%zV?; zzSdoeQi+%6I7|FGH?!+X!v`a)T3KreC-j$Sar5J6```)y{1_%FW>87FZFVtc^ZrZt zh+)%h=lc<=4k0&RSO6%Vd*k$;#DCm^2u279)<4w@p|j5yn|nY|YDES7a}45L;yDs# z{QH)YqPWbl9#773Ob$S|+?e@6O2lf##IM_Gh#ff-#uBj*b8V-JzJZujgMJN?44)TV z&x5o%lcKt$-xi|+k@dmp;J#7j0H9mnqUy{s4+TLKOh;4*$fbX4m=9B@bWQ(__-`*~ z(&$JK$faJNd|nM_eD3X;{j%GG@0nf%c3>3RKrHpFr0Q(>eM+!P&CZ;w0#V56tFVkO zGl6Gw5tgRyxno#fPw8qk2qc4pJYEDAa{>~9IBEG?g?dd@IF+fWyEz*K?dy#Z5G~02D*SUD+(Q)ZQ7Y|We0QKt)#W5v*(W&6W^efo3U8^_>1JH$wZ4X26%9KGn;ywqeGTNjTt&eX1HpLjHR6J8cBOxK^E4?2~aEtnsHg z{^Qf1LWDdZGeu8_NB?X z^>=#gf5T|!0Ce2@O)>Z%JGnB10XmLi()t&n^uKq1sYCuBZO8&6qQ6`Ix(UuoCxad5 z*6Q^CxI5w77-wdZw_AREYpkx~YN;AX^WtzILgLTrlbwG%7 zbQpc?d-cDiNPRSEu>>eW1@BG-UkNlnC0^mDcYW+M43h{`?FycM`r+I$)cb?mv{v9Il-_P^^ zFGHM2MO6(k>u&G1%q59kuiLD~q$c4Zs&3^8Ec%R`yM#<6U{U_Jw&pLY2kqLIjxWsN ztu4U7&&Z1t&bwu)nk2V5 zTNBD(wSKf+kZs1avj2u;F(Z&&FkumxK*6_}0CQ?ZN4WRbM097+nuXxui z#Z~e5#^>@}oE`T2Wsn=gJzFhkSqb%x&GENHWlL(zNkT@U3;tS}|fDX9n95^0gAc=-yZr5`8M zSBP4Yu1dt**7j$s*qqG&^m-L>d6llrQB+_Tkp0c-dM<0MWPN0BG-0T(Wrs~oZ1@2X z8`YxgV(e|7vwBa4veuJ2yDQ^qZ<;~*8sLI7r%ANi)--Zwai821aJVL*e3y>iJ1c>v zr`Gj&{bnI@ZXB>fA0OP}7m4@#FZQMq3{@yJE9JH|N^S`Z@|<5}Wrh3U4>)vS-BT{V z6koh9h?zCZb)LTd3`B^fZ!}L1m!G6(uSJlOh8C8ghx^g~J?D>y9iJx(A(oghhB*8z zqE??;wFmYyy9RYU!qDw)mehJMRDcHpQEr`BoqXGCaob&;%kdjqGh$M)AC*0T>zK(q z0b%%8#OJx>j@CDJB67d2lHmf-x%uq$_fG_v1er|N6tC=2*b#3JRJCK&JKlfCvhiw}^pfdr zPUAI?{k4}cv!4Buk7YV5UuENSNv9wI`1iax`+lv3wyTTj^DM~VMI`y3)Ua~F$k;Hn zZ{eff;QUrwccamL6xb)Kdlzgkk?pA|!78u`Jc!lo{e`1J2T`jQYE40eWewNI&?_uS zrG49JuSKt88tI?*UIWjz1j`8*!1R%_6&>gQjQS!7gS+?Ah)^;owczVp>9HRTK{Ej* z1Zf5cu52a7R=>do*tp>)ab?$<3@WM;HA}V+5CTfkLVW4|^~V0sc+k82$Bz*z7+k>K zxHUiEpSS-1Uh$8I+KqdI0(P_JCguE>d;0G&{&B@Weq1UBhtJ>Fk;G^HZ(IDE0YgOS z-pU;1kiHH7|K%H;EIwFz$k>(YcO&+2gwT3Li%aH353h}oRCaF_ zbz?(f+%jCp<&OOOjseMD*un$W_V{0KLzQ;5lBDt!- z-eVW;L{974z#jX*Sqtic?pt%O5%C&Z^XRL&CnAKU1i7a$`0fNM;8WIG`)==^h~= zM+m+A!U`AHlM_sr4+(&s`;>3V-P^j`)16ObryLgX+h*1Eo<4?4(7u%z-49kN>iH<7 ztPnqO!!WBZp2+;1jx5l#>gAQmMU9NB!zf6CrZL`^CDNTSRx4h%a3ZAJ9%gGk?9~~L za7RnwSS+iCHt!uBlQ@?#8V51hzOL8985xW3K&%;qGYB~E07Fm>B+8O(W=yobA=Uf* zqiWraLl6m54bC}kv4i{kCDdD!i!qrKWX?wL>$Vc{+-&lCHnFKF6PW{1V=2J(T1- z-j$BN;J&Ok)p6Rb!8TKjoF6PI<2Mf9MLpXk?*2~rnTyR^Kv{oJPjY zElrPCJ?B-y3<-R}%y>dUJ7Sox;jUrLND-C~Ob%j>uYe_V?tdaulyIj4)(l$#NXl8@2J2>Xk0*CD* z{Ve6{)^)jxHOerC7&$;+_=mo!(o^=B!%t}goPql63zgj2D%=G?!ymyHbvR>}Yf*8< zNr!d&FN5!|(}5S-muOY&ZAXp# z7P2re9a|A>7E3+bVPo*Na=~-Gkxhiy!lO09U*&Z~QuX7rRMJspPh&fL>cpE|%k#TC z_*LJiY%;Fa>NsWJ4K{Z3nbtUlRGf7Y5KwWti#qGQIeMMSSz*fiRa+5PdHUF8vZ!lU z(%YlW!^m&r+-xsq9EvlYDza-es!ThDj3aGqkicCg?KL+%d%?(|^(GM-jXyUyRo7;N z{enerzIh_JBw{sjpyhB99T9%-vrZn7fI0l>OteHyDqP^moVuwhQz^O{R7HRS4#Mcj zrD)17^NQ2w<$U{|rW=C*uvE<5nCQw)u}Z@btLh*aYO*GQKEyTVo8YlH_i`v>Pck;% zDRb!q-xye6FV-jPuk5<*kCVTGhtDCs%wS9$U?AeKPWtdc#7V$d)9Qmo_s`ha2-$NO znR((9TEm7dak9gJv`^O0^O9TZ!aqsewu)Up@%@ftBbaCud7!0e&93Xj2z9*72%iU+ zgqUZ>=b0bJAkYV&C@lMYQT*s|l_*9JNwE4B{d#wZ0`>s)5oS;b_LY=Ap67>+4kLxP zT^iv7q=Jx|Di}a$=(A~>Mm>ubx3KE7mg4jhq-))^Wz!nSexW-RF3o|<1%)cdeGD7t z#`zsz-tt1)C6al@;=Z(Eqn(X1qOWyYz_8PjNiJtcB7@V38*iq#o1KzS=RfkKEArIG zrcTo%eTNJzL)RM<+Ru3 zqAQ?Nh2az|Jml8mCJdhbS}sz4ZI!oZt|e(Z**D2ZD1c`}yFd2o znj;<0t8XK^K`wMYZcXCkE1+?6E`d%Y6wK}B=XQT7LUNJN2O)gsWIf6DNH?L<-uUg2 zic&60zMd{tqJ4RH8G!Rex&B)zxqI0sNdY=Hk9fsKm{s#|t7GE5WDIs`!Xk%KC2n>= zXce$i@0&1YB$!8QOnU!o2c9s{m}(PBNb^vBX~!4@<0F(A;efk9@bbDXZ=E4ttGD=&QA{Q8|x7Z z-z02MG04Al!t+LYbtQ8stVgDNvLk}K3)G5u)}sWQYHbL<-*6x&s1y!}va}1|igw^k zthnPqWslSycvCk6<3;`Z*8cN_RhS}*sESaLGJs80@*uTTQUAAt zVz&s_IkxHHy`3agSHC)8!lgJZX17Kt*Mb5%jChnH_0swh8h1jqMgHON4JTHxJGsaW zNxKC}oKSd_mopwG`F=}}heB>5BOCD^OlTzLl@0EXLgHB3T&sycN^W9Z_#3fm+>zy= z=Ep!pU6&)L%}d?Y@ac%J<8StSP;f-@6i>f7;|0@D^g1NNIdT6SKELz|o!;N;M8{6> zHeFjSG~VcHFbqy=4RPrq6Ared?u$L}I-}34vPN8em7kbbp{^NJ@7;TzzcUEAtc`L$ z%}Kuz8l?}{ud<^Q=tTEN_;SdPT8vu0sR^JP=}pKyyvDSqn?EDy$|+snti~Q6v{S7k zSXII`m0p{$h;stY3zq+&yW=beA*2d>eKt$=wCSU_uL_8Wzl+sUiVHkmqW|H4&FU%q z-&z19tW$78nhhCIl`8#(#i!wImYNFC9Mufhct^&gP%RA0bOWi^hN3mXp25DhR<@I+ zMNVeig*79iX&fN+7C3(*>Ty<9f2C&e2>Dix{iqC*HZs3-sPsAmiQ)9uQB?JMr1lLI zb8QD8{S3>t{}i`K_+Z~UW4Iqcqx;-Wu{f9H5xU58oj}e7f9~9g83vktu-0zMbF7Q9 ze@v=l4JDcOTAp)#kf|(q#0sAmB(f~3!xmIS)faijicS<{UJ=<4SNzcyOx7ppdsmwne(EATG$#<3l(BBY&ni-WYn4YL zjYK7Yvswd9y`;_;IBs9^6nQ{EJWq_wd*s$N4~8}BqnTIglEHl~R5535Q2dutGo;lw z*31Ghk!j* z!)xpxC5sMg@@I`j!c_7xjktk#*>&)Egn(E?c4&KI*R$KPvM}rY7TBWKg%u`|Jt~17 zGOGt>{rKQY+0~b2zHT=tLF$Zs-bITB{=5p$w$&dphskHwKeIrff5~&guPCK-S!x=9 z>lQK1XOTm&#*$0J1!?KCs%*w|{!{<`(mmF>{!Q4U5bwpN@y@i*)DiS$6PC45&|lE> zl@!DS*4yqpo}Sdv3toygYH~5mUn|k!>QI`zpQ=Nbk0s{&DCo6l_MNDmxTt&qccD1aS_8B-Bq!5z)wN+ogP6^{vsp&Touj2FYCLJkgF;tbVJ8F+4qWjK;8D zI<45!HM^1D^cg3IQj8-&eh6C=X1@?L7~pRRxS&e zdh71=E~Xb&1UxlKmt9zyI=)^xD^2U#3a%lFJV)K{s_7_JKB|10i&3(noN&q6@`BJP zhBb66cy6@qS*%>eeCBADAqA2q>e_vF?W^2I(6-xaXdZ;@IkY9%R)u7$krm(JI2x(t zM6^w;_b3vQwUS8ECkU`}k(t+{3=oFIaR1CBe4yKe{Gfj9#9BiM7Byppukv0WB?j+; zEN5(cWGX^s9w^xnwc5)9kSr(1Gupp6R`pO|_H@|7l3E!@7BUlKNhXwNo)fFf zhP*dpBxhK?$TWAU3;`Qh$jt41SyyA$YX5VMN%;I8vqT5Y5Cj-M4)2?nF3f=$$f2Wd zH})X5{E5AUm?;v%Wf-y}9HN|fQ@Aw5!i{27k)?(Anf5L`o{#Y6QYy-Wh?jM(yBCQ% z$XF=hBDobqu$`mkP#wqF(BhAHAvqS^kRi58-;QOgcx~sYa4!#Twg3bmG96xY5vyBC z1&>3SQ3u@tOF+<8vIHFK#y`XZ~nJrR#W~ZZjn2Gi! z72%etgD940))qUtsY-A31}|feqQL6~_X>)k$G`dcqnf(xEQ;*_KmYC4Chu$q4SYwh zTi>k;y<$z(%g|r1bz5mKQXx|bI+^bf+~ObmPTbP7<%Yza1v(Iy<8Hnth49fg{pe<| zGzdc$?iVqdLtL{DIYr*bey=o8t>G<*CE>fad-&=6ZK;mzxoAuUFBYSBBt*CcCJn6FlNrQLAc)--NLq!Z4F?R=8E(S#J<<0;r|6kJuoK6LDY6Wc#GveTZVhm>zW zLDV*-pEl`_H)_wE@uy0d;cAgah9W)zRxftV~?J+mb4* z$ZQD20IE?yhdi2Yw+O5$^Ph4?LpeIwBAZU;y!liVN3F@O?@n-Y|G!-37%EOrxtYdz=p zRd{JxAbchqPmws{;4mqtS~wB%Fo$UKvjB7Tp4;FA0`%1BKak2k*6)5by0 zrR`V}(NXzP8d{@K735YZ3hU9bNAJ`oyAdE8iIw5}LOv-YS8YL2>IF7UtDt|c^zEYZW|Jtj(zes4Q<}I zw9=2PT7xo2il^|3P@H>b6S1Z*^_B+pwuP|hw6(KzFeAS7AI9V={n-c)8O&(IP2d#hRXmd$LHUDJmMA2V{ z4{(s*=w(K`v>-=ux*cpn9k^0UeK+rWwc7BMB0F^0E#DhG9O=vzityJN_@>OxAY>(; z@)H^1)C}k)p#z;w9IsGYkYNbB=YMRmPhiY3XsGFGl z9yNr(^2Oy{vuDlk$2VfmBA=fpBuXuUzqrud4c7>t3%q~*o7E(2Lj&D$JH_nO+25=N zMaEvx9dWjubGJmu-Im!V+z>_Pyc}NZ<@Ra8?#fW8+&Cc5$!M$`n=SX#2nnPeq&x=K zOoC@K1jz6g2}!)pbRnXD}0NmbN=fq$f7Z! zh0}J$YrKQgPBNW#pVU6{lCQp!aj9ib-P-Njw7R!|sK)_Swj#LG1ss4?a>cH{YLDbJ zWvxC$)HyeinHKJF(7OpoXZs;ZF09GStymr+l=G7L+dZw>3A{AYbNiEzSnV~6OwmO<=L|-mTfIH9{L5Pe4te(hjIikw$rG{);XtLXjMcutMgFAP^~;_)-ZR>#D6xUO<@=PFGGRM&#yKsPT*W74A!8IeXMaNDZ~0xfc2SB!L5_cPTGkQXvTN;rhkNt1EZXP2o- zK&td}f1n$fh;DC(@PZJ@BQt?@4NbYv^I~_ZucNdwQfeCb7d)&n6Q4+JvSnXb6LK`> zds%V_HgiyL-kkE>3rC12`0f9XstNU^g!>UmluFY&5ISKV6a!wZM{E3njok z&ur?@?F&rXOjUW3Q=x*(caN8HSB;p;D5idU_9*T=Q#J1#otFMd2`gqzP~N7i`B9>9 z?4=9T|J-p6J5|D4tb5BJf4}u-*cY*Lg;{@?=R~V8u>Dhkp|4C~Z($!{vIX!%dv`ul z@7HwPTto3Y(O8*k#4YPL-3DV*(popGGo2`!PcE z0MRqT(|7TC8UdFp1tBN-(gv!6zzTY_uoadPIEVDf=FUAvXV`a0t95jc&N>=jOMIWp zTSi*7ms=(p^)&aQwroAH)SUJ0TK3n9?RT*&65>VT`nZ?Daxez|IKcU<^64h>{2Bk$ zK|gNNrtqXKh_rLfO=Ws4Dx;Uk&uSTkImv260h3 zzZ7u+_lXIq9&QlKGnNRDr*#VLY~78t~>MoqnS)VmQTpyzu2mY}9p+u}$~I zu)fhfV{{6g9OQkUS?(%Tc}Mn7y?-oJxJkhNJNEEmrLa3s_7(r&(x4=bj}w$b*~49@ zu?5SpgrgOpg-Y{T6K97?m5(3TFrYNk-KPTPo9}V#?i|kMb`JVq2#8x-EE^Ocx|Z_~ z$$=kq8j%LpAwDdyG}*y~X1e2%>tbx*Ck*h}P8W4a=9>h;R%A3G$HB#`c}Ndk#@ z2hU_5|LdQB#@Rm?VIHBo-54fhx_!&L$u!w?EWYt!eCNT=xAcd^-=L9oID!IDo;n&r ze!7x)p5S#iSYf)KHZhL?H0_R|svm2lMHk*`@DAe}=PdzEp0VMK`@Qud(9}3|v)nI=_>+ogt72Mbr4MW@1lJbyLZp2{3OL(D?~9|WWs zo6BpS|Egq;qrG`CP0+tbc=}2wnAmlj$ISOLDba};ayN0w{o~TA7Td^e{c2g_>QC{6 zJ#c3U)|~(VECW5`;m12d@IpGTs9^h}$Cp;8e=A1?yng$>nu)Ui!PBMx>$>s9b6c;IRh*0L@%-9{Z3-;a${D-|;jOLCzN$JL|pz=s=(r-xY4+LwSF9d=3 zpI^<_E>O4~FGoK!|N2QPkf(h>772|Zw%Dh8Q2`zBiN5KwvdoOO2Hjf9<)lvJBWsfL zrR}+Q92S%1mThfOmUyS&dt27$#Mt^ zA^#yQ}*3jmo=S`e`Wu?Sl9IN*$AIQ z9?tzlO^FoHkwmQN^0P=}uH-;9`k-*BMzafRsHUB&h|yca zzIN!c8rf+%;j|Yv^tbw>Tf}%*$-1MTeIm*mh*fYzI`+yul^!R$h0stOe%6oUD)T~p zzwp%j(C#d5VpNVtQ`3<3^}CnK!}EE<&hYkDHo`E=i?aQ%zCs1dLPmiQQK}h*4lM=M zvT}x35)Sk%$8@HRwbmB1HSKgP^DQQ{ffkJ}O(pE#*M+BY5K^Sq=Sx35CWz+;Jbk3e zMs%Or*5nPiQ`*lHk_xu4x$+}>iVYy{-s z$2kw+Av5ER2MK0%zn&6skctDwY4#WU2u$Up9s72s{DZa+{a&j-GxKplZr0+jq${s= z?Md4|-&@vM=ufBEzIDAaT)24w-_pz-1Oz{Q3&{dn7fC_oLAH?>j&hX|K5RF|0BBoM z<+LGnSI+WJF5<<&WdiNYT=VlNbPJR731_Ypj!NI`HNYDJg2>KF&r1hbq8qwua?ie? z1p&0)S8W8<>aSv}5kwLI3j}VepnjGeJ#a)bW~{msoZK%)5wi8E^JvRue;wK~G!l8i zdJZ>)8`SK(jlruJ%8U7$o}}PR{rt&`t4Ji?e6892?_{miSl{jdn239?B3qh)IpK~< zy=qz{wxfGbm#NwI*bfMsaadkRjtIV+s#YuGj z)C&(Nvz`yW%c|yWexU^n%)3sro}yZuvwb4YFJiQN1&0YO@z!-=PFlboQ*iZofB~8K zPwK~^lZKDreIx8w24hhauvYrR3LA&y0pBAsTCa&QKe_PF*te*pjlld*`%!=|!{BWA_$ z=WbGSn`%7qF7v?&UPLFhBJcII&($;zhrg0|zY@s@jqMATp9efOSFyy5lm#K7y|@&N zXON$-=yl1mU+oT@ki@3*R1p2Mh=>#G5pXcvdLQz5*@=db2`%~ZSJqKO4*2>5X>^fs zhkH&%@GfBzj7C1;HolCIC0@N=v%@}4N-%P+vAr$bpg^azA3+L=h~#q(1EqCc_eyo* zEAsck*dawVBjSs6Ms@Y0P>#X@mzwF@bJ?bkpwa7HDf=A&*@#JIgH>MV+!1pI=LRnz zY*x1Y4qfH+bw&=t%Bed}2YSUzj2#+mVQg;2$za%Nt&H|xM+%fA1-ZFJ{?0DKP zj`_x5Pl1FuD;4w7I$?KXHaOI%v1*uF0lQ1!|G{%K6Z?joX3p^Sif(@(>k3*%6c}xj z`MaXFppmlxgc`R`Tm}!bTgSHKkB?33_PuCI0e^-UJ+#Rb?%lTzB}0`d zy4|{amLG|G!YVGfYuK-&YmeWPKXw{9>!$BZt@0&Mb{@f5XoxA^^PAdTruxbOI9Vap zsGm4Qow0Fa-mtwYtlvd*eK;g~So*s#yZzv$&UsGf+D-_Q>)}r$W^-|-)K(iG1Y`#L zj?rQ*A87trP$Wlsf8XA0P6TS*?h0bE>Q2=^$B1;3}X^>ygCp9#^j61ohb)C7K@#g9$w-cl~Ka_Kp& z?H#NeWOVc9b-aP5!56jO1!Y;Y8#lrrNM`c8OpQIW-}?lIDF{^oRFgRyJ9f^>^j zq_#V_F{1(yJ}0(8JpkuXsTkUY_R+m?(8z|DS$P8Kv&9% zC&u{^S)>v$&;caSP8!wi`YFEUqX1pM*Q~juTAf|KjB$0LD1MoNKYVMt!>zKP0OV{k zml9q>`C06tc$k2{-$~-o|K=!MrO*ZGYM9|z?uM#qXbpLKpsfT8=q`0_3uTNZ^qc6M z$vCRcSE>*lCc&m7&|B|l(B`?vltrVSwDFMo)&1X^1R5E!PwI-HY2@%u@XWk)h1T0f zYejaJy-@8@BT-lX6_>7-u`XL!Lv@5AJ}dVJLdk<>B}HrrrO@uLGq82e9fl}<7kr|_ zVo^-8F@>usNp(TPP)SgP-Dp&)3NG*~idZzh4Bd8zts4uu50{34`MSFp&Gg}C7XnZp zEh`%i{?13Eg8%~@8b$nT0j3<8Yk(|L0|0e@fG}$cfAh55gX&yM#0l8LKpHS@ql=5G z{0}uz_E~G?x-v--6&Z+pm3l|VzT8T)u)WLNW;~ieTeG?%}Ym>;^45n0nr z7`SL9GYXSGe0ch`z2`t=#CO0EfMo@nw+W_e+1RZ-e%-fWUv3;bv@m6DeJbdVUg1*~xrwBd7apZmXQ zXURO1)DP<2Ma72&^tL62&ZV>oi=f=>W19V3Yp~7QlZ?Od%z31G{i!!t!Iq|*_ApJ7l(}W{C)!)@P0tjS;yZVx6jn7{YfY%OPYY;W4{j9D5TR4nHlS9{TK>fdGn}` z@3R!f0%;>VTiwx@YYb=>3ed)qOVxz*Lp6U(WxG?%XrDU|t%^c3EUABRf7Q#FMU zoLjyntNimJ{Q29JX-y{IAigd4ul=c3plLv&0`~|jyEWZ!ZyE4lL5L3dD*bvo=j`om zJ{R7thTf;DMTE@4KT$cdX&AC%#LCC4@WX_m7G4}{>hDuDQ*syF^2fu+0RIfte zM1w4gH{clDuLir2q@nsJOseI$?sKW0-=BsC&xE{tUez4G_x{ zCwZbRlbg17nV99DL3+&_yM3_b%!e5&Y&Wcs-llBOIL^6ws;04xfi@XOyE}TpxW%l5 z@L3zA&*|0dgFTgUW_Lq45KNIB33J!icm65Jp*rf&8yBGwaf2+xoG5lQLA8k*^bSV~ z>KiHg<_RXDVvYC+Z>bV1vRR3Nvo-~G>ypo_wpW_0Ni(r7a$6#x@z9`p!07P+IMU~m zcBjGs!j|JYBJpYgAUE|q zV~lr3pW6U(#nu~`5@a*?vp+93g?KjbwVkgUaRH@OytNu%rSbBbw8lNQ>1>)gwa=bt zg$3bq_89I9_sbB-rH05jZy$be;YH}miIXZu1oWe+fS})rCkD~hJ>oTlT|CjB#xLPj4OgYr4mkM@c=)S7tnLiC z)t|-mMLqJB*jI(HAAg4$P@#cSoS+YH8aoh8wS9a>j<`;0{N{|H2*6VW^!RdCZEC%K zh2;F_cPG@xJwPC69vL`>9X|;L&7a%DtF2eq`<*>a3l=b zjS%L%rI99Edrw5WHj=y=_}>f2RFZe-dTsJjCBrfzzI-jlujWGl31C*uqM3r2tGHH> zgy%_JMyC#C^Hgt{63ECp$?*-ceMb>!xYqCzr$>yc4&n1F)Wh{T6P1n#t&+WvD8e-G zJu%cyX)wv3H8VD6AjW?X*eRr_83NLC2iLBE^NhT!uQa0dCp>&f2cT%J3)s0YDMgl9 z9OlN6$i8#FhqEQ1YE{CW02QPNdA@&Wj&E;$s2*xP3GNS#wucC&4>;;g;p5Fo1l!R3 zA}RZPWtioB;@v~!ffcdi=!B}E`PmIp|7u0>G*qE1x@su$eqy1g>5d(?_x%a;>AkFl z2HU`RzyfnKQ)ZoePrJYa%K7RHGT2p{XBfSt>7bOUO1?(ZT;$xO<5Od(i!Y9_Gy3$0 z$@eCCUOo0G;5^>@_P0v6xTiX#uk~oQZ{a)XVXnt#Ga;8mPG9{O%))Cd=O%l6H&i+4 zDB6mYgK%K$SjGZy?ml#?)?TNDsJFI7M-!z|&g=cmmCQb=QS-pPl?tHo#4UV*or5wy zR&=R}Upbuvyi>8oOxU!Xdz?hjoW)SFbJTGGN-faZX#%7WHno4U2_j zTinI#E2Uz`?y(dttv1k-^o(ZvMhCZVFJ0M}&_UBlACE zJokSwo~MO41(pAZ@#Or)c*f8bdKvyB#`E$Q;|UTh#KHSd&%kZ-7vtdzn{fWm7>^Vz z)FSrYaGhVtyjZx{FTGy>FT&}G5B`(M&3M+u6d8?CP|T-Bvi}XS01_4`59UZs2wdi{ zwzJ?bXm;&Z9^%#<#HgTEQ!eDE%;3YNIIJ5sj70y1v?^6e+t#k@4ON*V_bR1-HUC>7 z=$wm>YQ&G&VvZ!L+`OYf8P~cM{fEG}DR`$t?BmlAC`>dZ*THz^O&wIJ7m^+_R^0b^ zT(_Br!N_hzBHSJ+?96Uq0og#6dNgcw3{^Fu&gIOXJ?Q!b?hPOg_j14&DEasNNQRKY zhUTd07OTlypxs|Y1>m;6&i`hBdBw}&B{7N!D%8}!A_czxD}WW;gGqQc(&tIwZpmh# zubE`lwJj4c{9}$|eMoAI6zN>Ul1tPX-@W)Fi&O zY|lH>`3TUYj}@pFRmg(I`OwIDebT-|=fQz$mvP-L7mRvQ#HQXCNq-0io3`kIbjU9H8eN4jni z{A;Ld2dj5DZqo18=ZgcCeEZD304`w0r9k&z_^vD;STp6E?C&BUX&NoLyL`PPKk7wS z$$@r;^Jn(E#F-(eGK-$%9#gQS{T8LYA8Bs-FmH1ytlfWqp4MQ;Kbz*Yc%E~D2r3Z8 zcP3OV{SUB)Y6VCe`V9}NF9`&3-$G{K>uu%nhcJk((fewn*@lf4)tx= zxkHik?7BS3BfZE?_RX*X**@@rPY^m?@V;k{R*>97uKZG9jJ7{o$0>;|)y#YJYV25s zYy#_46oq;XHUbT3!1Q?`!!fwutqb&*vb3-!2N{iW7r^NHSC7oMsL<5koW_tJXv`*` z`(RtegHD^x%{DcZcF*e9A@?Tmn4{h?$PN&VrbTmbmIbf-Z*SIuK|%A?chn?+h!{hE zmbewX?jTgETBRri#^Yi5{70meZ#wfCndZEtU2g1@RC!%SST1f`eecI50#(iW|1FlX zKNFan{qNa?u3~3je-_x&2?^3&9pNMNk$y}=V}vI|cpfWR53GiQnIlv%#HfSkU6jsv zjN!jPf9549{uC~bJ=WO3d0Kl8wG z+N|8nj~e)27=S!IRif5>SfMdeb|w~b&94K5%;LYwMAXTBRL+}+TeBO2$NYzAf zw7g71kG5$%8MabE=!uJk%ws5jLBqeq5Z;uS#7DJ7vybDjQk~Jo$*uoE;rq;ovlG+x zUk{6p{7WO%gZVdsi~oj^aH4&jG4%kM;N5p|24*-2j}CwZm`@tnqI{mpcrf`--Jrg{ z3lgy4yfpK{^vKlN*?1S{ezLO?3S)msTfvyo%FWOo|@$c z0>bRO7zMC*Ur!`?OJtYn(?ajc#JAE{nxLXB>49GS2m%KFA~a9upJXb2Mh11?b~9VAqC zvM#pbfsr#7N)UN-nf1*c1KzBu4}o5X=o%+<{1%ykO)lD?%`2LOstLGQv;9mNXL15_ zl$XdNdqvGpBbDpoZ1Omb_kx6Rc-TZh(>>Fu^gS0pte<>=SD|4D((aG2Ro|eDL@hJV zCV6Hc<8ANhIwM)nqh2N5&O*Pu9bU9QaiNXZH=Sfz2|2-9n6(Zc>d_&;7o}$pBqLpb z(Y!jDi+5&^xpO`>qAxG{CJtSJRP}F08p5dyt78B%852Tf&P!zY5&6#|E>u?jnNA>BT7PxW!~^dYuO6O8 z%MxiH%JLp!Fr3~NGj!wYlRfRt#2rKIl!-l?HWa;2^d znB{^rDkD3Phg_oK*dP|QFE#VN$VhhP3l}^loK3`^@in`oV)#?D2l!_~?W;A-0P@NV z;gxsd+vK`h&TNEdjemOcwF4Z=nfwf_{izN2D0oKvd0Kr1q6pk(&36D zJo9x2?P%a*aoDw>0(+@}yewH7?m?e)4(TT*#SFVZ(7#=!DmAKSD?Mh zy?;kCLSGu*=PmE#-OD_>#^|`ypeR={rEOVM=~k$kSWIomGv_thg8w;Mv2LtzYNH$c z*%)O!+yyB*68j-E512;KMx>9tMg#cORi`Xd$!&CfY2|P>N_dyxeAN-|euN6N;e(=z z)Wti`1)Xv6=Dl8AfyRfAN`~>h*IR_plb~IyB+EzVCN@LVDk3&L@b#=HRn9O`M0SF` zdDj=?ri8-)+o*}-6kX;$<(Jsq>lw6G;j_7YU-+{T5TctHEuk|Wg-GCEDCDjq+&k9I zWeCS_0stPCaM=Usu^AX85bgYoz2J^!6o9eox%N$0cMx8FL5e zWjWm>x8qGzzvkgPf_u-ICB^qn8mU3%{}jI^Cfe3T-zz1ea#OLnidUR!O}Hw^W6s`A{QY&P7f z@yv8=Lou0rIx_1CR2%BhDUR5u!27SADy%1r9dxuMc1MqH+z)t4m32^d7**}egf5_O zEBQKTz@X)EJ?ozuxIe|ea0(~g5P7(cQlOpU{&2$V{)RKnUp@(KQI(1j4(P~d%}@#X7V@s#X_ z4d}*EPE0e4qbu-B&?wg;!9^~TVq26|DOK`^IekqY=wc~Of>T5wQ+v(nC0^-zmk;;& znR2h6xib&H`{^O3%=$Y|u&vp>C?%YcU3#;zfhnPzw>@ zuhJ`+NRqi(|LD{--`aC)cMQQZh)B;tD9{GBh6RoP?DL#Knw|Kfc%*A}aKu9VRu`e} zDjV+%JMGmLygUt+rCA6q#l<;mMD4@Rw1(8XC377_s=P6_*hmY+gAcx; zEiZ&axtXDO4tAPP|F>_A_;VvsSU|O|uIvP(aW6iKJhfx^`fsHY36B4oFBh0>$ z8VH=D5}~cdF>Z>yY<+!74{5TmJ{jM#I%npSOBMHo?NwG2=pDR6H%dZ|ia`L<6WT zDbgbd;7vd+z@;`3l*)+`XT3#=!HfLa&0+`wgJWPPT8hs0O_uy&ny@&Eed*l3ZVpl? z)gr^k=rso=jK5e)Ia7t|?hP7R%So2-8cd}A@qottYN;6Fg3l+Og^Tfm*|XvneR7h8 zV<42@OVU<95^}j|H5NKz`he(o`3u9SHh7! z-9QU#5q(TQzn59|STC@rc&$SyJ=*isk;1^uJAKy|PMVcV{7z`21DDkN>xPhD+;Y1C z#?X&X1WE=%Pyf2AFlo0%ueMv`lDlU*EMMe}Pd7-fv?Kql8^<7$mmI}_&&}6NzKoKZ zMLIh*_oe%HDq=e3@;0Y+wcTK%{I^^=V4 zyp!^=q<7lV%{&5#cqTl{IX!>g=JnwXWzy5?k&pp4;SLUJ<(q^8dR`R-$5aE|<8J2L z=J1>#ezeMu6+e4F^|12$z7%J}EGuks;|Zl(MB-m3;HxY(uoqjCQ7{%@m24F|K5Oxx zdJzD;@f~2mtGUZKYRji7__j3PDsHoZJZ;kdG;0UbRFU#2+_b~{x?*R|D z-qMVubCao>Ak}5}GNIf8@!=JdbI0~loOD}CSEL@M{Bg`K3Z1?tLHrL#Dd(TSKX7(z z?(p*1^ODamsOF(F3l^5laQ^C=YrI#s!;U^4hg(F^M>GHn%ycFk*Jq`%gB(BA9h5;F z^H}_<6gMc38x*E}^TX-r;B4`s1){yRN_(WaGyM{x@hWoW4`INl=TVc%2~@|Zq&K@G z=U?RoE(aa?yUJxyTVbFDPnRAyDRKGw^upYBcmo9cmwWvpgPpee(Y}T>h3v#Y29j1F z7W_tgPe4gr6!OU0qqG(N$dk^|(7cU#y%rzNkkXH|ngqWp#w|e8XUhhC9Vy4L>d^`m z-M|NLp6QUX-eLbY-B_pmd$3ncXa*EPa>yuzDcqJn*2EG`w-=88S}K10cTs>Rl5dL8 zC0=JH-EWjF=~MT6<~3n3dK;E zjKd4=^rAM}R&epM#E{erA4swQ&o_U0u_fBqQF%^6}jmZvrDP8WOKl~2z`R@nRlnjfC4eO>9wiGGDD6dUhd$wb?0I31ztErU5x`G35u4nDgs} z_W-C^T)^0nUN*}xyT&?vxDoL?$m*8@yER~h*my`-kKo(Dq1&fl&mGGP{dQomN*i- z3QioKEus=-V!iWc6N98?=sd}8crQbf1J8m#yZ7z-vCuAT@4b{P@zR|5@aJBw1So8v z;oLV6CC(`rKhtUK%J~Jobd&9pR5NPJduCL&Fq1Fz(%J;-h*Ze27J=wp!IxvWgYdIY2aU3gZe&Fln70hP8 zO@)K?GUuG*NJAsJ)5>Y^qrlIHW@ABv(fBBVQnr{H1!6=ds_e9W8F0FVfi~5LKRAuX zZM#!{Mg=4E_T~UeEkdkCP-}_4%>6Y{gELZ%7e;9kHfFv#Y?p19(yM|O*NJT?qI~mF z-pM(lfLT%@8!t58@t<=b2y~cp`!Yh03(U#@gh_#;>$sfpIAW9?Wf_8)UaiEpDe32) zfjf$5HL@tk-;ttsa3v0A4qG+aI4rdwg!X|R#oSMU_#?k6^PdkXazPrOoMzg~ zgz;e{^ga{l~70bzgY;M|4zV_{Ru532%wZrM7z_&@1 zZTO$m2Gn?dKDG5RR}M29{iAJvCp`93OW`*-fJiGxhJIJ@sI_tng8x)$pF)+VA}7fI z5MSTZiLa#FTUqXRn(d@;N7TY4cx1;+P3Qn=0;=B+1JQYXCfpNX_y?7i9tRxM*)THDX%HCGHR-u?U&6LmO>`^9xy%ydA-A;k9XdCs)`*iidL8wt_qD~N!F zcY&eJdkv_*SiC7-UwCr4>khYH-JifCZc$kI3t_;+sO9}H9>za^{&`?AeIuVqY2ujn zT35`m6Mt%8waQa72`r{>ytn@KbimS`sQ*2fZ%cBl`V*<_krDRIMrJ$ak4>c!MB}8) zSIzBiTy-{-B0U@MvU#k>#<~=cX;thl9~|W#T?427KU{t27b6aOqtj!eoXhn`2 zK|JH3R9XWVRE1a%)ccSS7%30iRn>FyFrSI{fjeDkA+Rl-gg?1!0rrS5(|=;^4e2M_ zin!2^^U~n4S0AP7*Z}bgHS&A0Inbk#rT4!wx&HZW{wE70?8qSO?<~OoT`d21vHZ_> zlY`1o*p}p%KR-SHsE_~b<^O;3{caw1GuZWL4T*cQLS*oCD_(ZezQZG$hIatq!$!f{ zUm+4KR=8b~pkVC^h;cSV0#%GL3JHK|#`nO>{LrRp$+|+oMimTh4|)V;u8&;I30y2# zj);Ue{?8zUB7ew#|8Icce?SQL|F|Livzz^WXaW#IQQ)94M!Ds|u~!pKUO%|nsP83& z>IwBFkG_tat`?Ew!M-Rb7k2eC7j5?)hdYXARf_A6ZIGr@XfP^nAiKDDDt;=gNvVTRD=JuJsFd4;PbX;@ z0{(5U4g@F76fZO4x;WRL$J&bM)=ti)ZD8I$L>V8IAeO%J1WE|hRy40==I$^A=mT#- zxy$Yo?|&fbT+#SZwb5J}!tYamY$ew>8Zx5A0d3r!&pHQgF(BQSYo z3_Ex6*z(7n7aURGJoQ`gKu!~s6V{h3oeoHU3keb<}L^ykzw>_ng zPB_n3zJ)|?mnod9SIUyZbQoW{&!&T%HMcw4gHW!jJ+gLuD@MC=pO(PQ=MQ!t;*?cR zDR*b{de43)j*Ww8h?2$JU+g|2{&`H~7B~QP_M38tvD>sBug7*3N!w>Mj9S0=;z2(B zXOGQ~(zYzzS;>|}DZ!62g+1BhR#KKP0xRw4DmDVPhTnwA@py+0zK0`JKDMNf!fIlW zfC-L-j?yjh%QnnAup;o{ds?6WsAtXubf6A4;-J70YhDw}nJ%gn zq}S2cyQRMcYX--Wnfnw|3yt<6*E;I>bsV2lo53?5tK@O|{*39|Zd%E~C+_BujTK0( zWmg++icNGt*obpLV{=%f#V2|8MqFEKkw&*Hpmbu)GM;v>*&g=~|X1oy~a?f|W z{bGBIexeYYKB?z=vjv}tsjT<4Q~M^QoB`}sYp`&@03F!*SxXxIDR2qUsAMx=s2&Ip- zIkG!%*|LE5vB3iGqrU1k#(DV*b=IfVdcYaaAGAL&4xcuWE^QP_z&aBE zoaE9jid4JPh~QD9?*i(ncgp2KyTb^nJ8cOu0t?831ubXQzA4)R5=16xnjUkQn2{Tt z9QO4rxh%B`sI%v)+S*~=i0ab}Bwo@75@YLga)s-qKIcSCob0z-4Aq>CxP#Ap4~dB? ztPOfTNU-}*BI$aFV_`}bBK|JaxwI|v@>3HkF`QMhP^JNEHa)ZWO$=O+A>f{w7|rL= zF?ST0-gPhgP1K@dj0XKt=KBoyduFuC_d9*r2x+_<<4{!J2Zu3M4ocguEmaqP+m~zsd!d8Ergt`5G{`o7ZOGFeWq^6!`;Vs z$aU|&I(UQAR2U%S<|tN^V#$?eZ|6%g)~L~$U`j3X6Yh^k2Xx zWR>#QCgch}r=#W>xYQJ}*CB*9!%dKoXC64Whp*7k#C)Vp{?0<16>**d>^>q40MSAc z^#SXUvS|AJ#qT3M6hD?NIAiSDM(G`dNtc6M^%Kp2l{bf1&K$F@^-VU>t`D%Hp5;5& z;Mxtc=`VTSYQIj>EV@)Il#|uKnu0y=Kd}W7#&MDYvzK~95FGnAxSo!G3Ef-db>w?@ zWmSxHK93v3_R(YR{A zcgft_btqMv^!By%gP21G z4Of`xDBgO)VOnsU>xZ1%dU#j)-hwK;v8%T#L_QG(TOPi0WXd5+X*>-=k z)HBL>(ZcHM$#wZ&@i#2W+-&3Zn;>BwC4a!k_IMpl#zZ+?VOY7!QXR6pR$Qvzv4|SW zI0Ttud5>Mf-YLK#SHcpes~m5n4gDZ9L1wq9wa1SdzD%-QjX>_y?r*s}Si?-s@D@fc zKb`Q?PAkw^Sy>OF@erFsBq_%WUrry3kNk1&WtIUE zPA2RmBqX0YwYVUL=7+DB+v{98l1X7AaJz!PFDkg{CHmAkZjKSJcy|wvZLl}JNsU3FaPE~3Dp^Zpk z8Ecn#h`%AOi$^jnh$yMo{1!QM|44{jxPzt{eF5n4jcsWXPQ#vkz+uTug{PuZEXEWL z%uVRY{m>OI$zmwO%QoLMj(9pqRC0rjtKRxx%^+$lQ3pb@Y-{)RDBTge^udiaC93@{ zOv~HxdbID74_E5-LV8Vm9nlwR{Vqv{4=y(*#4mdjOtac|K6hNk;vSu0AX(qpQFdz+ z9I-^n>XOY$0pYTi1nQtz!;ek7uq%wV+PZ1oNUTM4N$UQ^*XBk z{@UP*+8h1g4>|U}bTN@$KSsw{(JKjmxA(*nBM|dB%#mT-fz7m|C|Nk|PI`fN9|ih*!BB-Mqa{ww_~$1a0$r$Y z(NTLNtu{$_Gcr1g9Y?HvNP)bz);j_PLiNx@vav3!%FdRisiyUWjgZh_#Pm7B525Ip zGhWFkBWTtc=uZTG;ktYdN^6o9R>Rw{%^1fte2SJ;@i|MJdJ(;nRbB1oFiXoA?U~cM zW{EtHaO~K7irPt!!SS@DSfg3?c7kghd4UE~p8cNkA@q@|9}!tZi=CY`C=2t5_Yyx$ z#cd?wsI#0-gEJ*@Z+LI}QV6N_!bSF;_zU4Bzl$Ok$+#7VXjD_OL1VqK?XyX41zw*L zPW1|KD<3HH(tVpLV3v-kJYbMbuM^c1vJT<8 z0nTMn>yV?;z_>%ssWfBUxJ}UAStUQCG%isv8%32(eV^Q6#6es8UuV&>2BbwyH(VJ; zcRSX$jYoEgZCfM@xkDFK;5op~v-};b%ReO-UoqE59odsSQ^t)lJNkOtR#-NDaRMu_ ze+bQm5n4+_X}V%$l`&sX(WSvzQH$jlQ319?D_LTRnZzFO~J^mhDJV;MlZA z%Bg8O$V>}`Do}~&+;RyVpHfxKI~wCK7IKOa->BzK3S18`+zn+ki@8m-tEBKQzg ztMRrZ3c#0j8<)jse3KL2hZUj8X;O{VW-O~fCzBAY=Ok^BqM|T3rbE1U+SlykEp)XX ze515CN_JmLvQ#u)!~69kWX-e8qzzYbgm&g!K8wtkX*bg8+F#(+Ji{U|F`jcIx^0bN zj@>Hq{w4j>k&tuhY0-1U(YLS#kjc+xIE$WO{VYP+*66{XuPS;F=ICpP#PNx$AEXjz zrD^>`re36%<6lfKl1Sgl1Gr{#=*T-#!5*}@pYS4v68r1eyDRi~g>)~!H3Rv)Y^?bz z%8p!pjwn|Gb`__$oU2a>N0#;#P+G+&V#@^KPy8eFv{pF<5tV+wXc7?bBB$j?Kn$bxsvi3LHcrL?gW;Y)MG zu=R3BzYEmmiC-&Kg!@bVFISqM(r8v#z36Bq513^c2EbQJuulnko$#8U+Ux>jY&-mW zyLL|_{sz=pxV-ZL0Cn9)E++t>4%TZ|{1>3k4I}ST)IQZMJw)g)KplqQzX5eSU+PeM z+X5mvTB(V>06-lGeA9Z(q&Xh4(2Bul8W39!zWCB*FCBTSx-l5?1c}{;RAkatvm_Nu z+e-8G%f&z$!$@K*mmQBq)~i(=7s5E!1=78P1aMy!^7a<)INU*@q(Jww*|g80!6D>{!m2}5-BiHc;x zicBVc{Uhhlz0#5|`_3a6;2i2Nrhkcu-qdpDC`la)A)TcXQoQCRTf^jE$CNO3&Jd^e z4uuib4}ovT(G^k9^gIZui+Dt$Cp;*C>4~*;chZMwv1&w<-`gM&7^DDuS|xqu37REV zr8YLt^36pK=}r?kEN4qepKo;B)kEd6YQ0|Bm$|)Y9!K! zIIZ%_3}?3cYNst6)9Ou z{rNsbBs?#e0B>Q+acHB2n*3Yy9K)I;c^$59Schle>|yHr<`NB=xf={VnBOoR{|DR~ z#Na#3I?!ypsm+_yBC5y*b%NfxD+o z+n^tM<7%W=)^gA4gCFs9$EX-i;5U@6+(=@#TEgi^HoLrWUtdn|_q?$S|H}BmYJMRNr%FS@%mxMN zgtUtDU32ld`7tLjm>l=zgqxg9(*@DbAIZeZ68dywF&|b{g=ad!O$!&s%d2Vfe(Eb^ zoO;F#@xh|;;wBk{7$uIBm8!Au%h9sc?=3Ff^f>~hmbcME!_d5+ci{N@v{98aqC?D+ z3AZF@9C+W}6!#U*EV|`*+o4lW9>u7va{|S7D*AUHQ@8Bj^orRFeVxdsXYASpU~glz zEjt-9ZMbMNYWi|SCet$7DsLdn$}#Wla%Ym@g8bh-T#j=aqEg4#x^Z!2{00$s6;6zn zCbu{JDzb2VPtXMY$u|U| z(N!G#-3f>N2i@V6)C)!wwfE3Ho?G?4xQ%YluGpxX3JT9><(@OLB%UJ4^LDV$Gk}lj zsJ8CyD^U!oXnWEU6F6NDam$Ui6%6mq2aQBc?10>`M7Hg&$w((7MkxIXJMP`S>Z<5A zZvqvNnC;hKH+Ywdr}f)6>#_nopyC~oY|YX3Hdmz8l*FE;76SB{UG5a6x>`|8E7s9$ z!kry5RjX$ua=f?hR%KL62AJ?E?S7JTlkc+XT4QjFf5^QfTP#9}KJ5^DeezO5oCzwi z{3FPYH^-H~{5${kZoc&lK=XFUK36#3Bq(vxFDd+DGxd4|l}9uLUKi~vd{%n6n8}@n zPonigXCK~a79~OH)Jr7I_PA#?86|H&H8ES1*oWZ?khyv3-`(c#^P~->bGS>EBud5f zo@Ze;hCV^TO{DN|(MreX2B9X{i8&q{O5(i@^VK)&a=Z*pf1W{Cu{|^)zy(I-Eu*IR zu)z9MiI`D#GC%<_Hbc%sIzbbH=(tq9?-LVG=m3sVDp3-pr%}njZlzFmF3YTC{?d>}xid@q%=aeG=H3L{G=_6#9>M*M8ydMfvv4y|&J&rMxN3eX>G z7p&usS1R%dkbk9A)P3?vJQ4x(nr=hZf2icGwo}ZZOGwX`nlBr)h0od`7nV}a@n||Z zW(7QJ3C*a^W;gHX)v}9NX~P}&j>64VyZsXO>HwRI+47QEmZ!fH-KOiUXbz;Ylx}ra zy!zxwlIW|#fYNsljs9gcx$CbusPVK>Za+9e_M2qbkRFY#{~hIQ5Pgdzs%3`x5o^e)y}E0>CD0<6pX{bQ+M{XciZRL6=9>)YFL>(PQ&7 zgWOjsc;>A~!zj3Cs6Sd7S_{axNXsz+ag$Bshvtq$oa3)ggi>$mP0|AAk#86mK%jiS1j$#Wtx!D?# zjt^XTtlC5rI%ZjvxF*4`p2^fklgK!6Hux)ocmrEGb zH8^=e zuHLezJJsqlR+k%S3S|DyLI&wnM{`q^UdMHJSe9M9^1AXeemCCwG^+a<#q_zV-p**C zssywqw+}Q(NA0+z?Ma_gUM>PMSb2!ih4`i&#E)Jdov4E$aZjQ59(;J}1E8JljF*=z zx4={PMTGaZ0q+`{9RGlJJAm)V8|Ce$E1}d}(v;mSYIJg7(>BdO8e})MTMK`x5Q__9 z_O17z@N+LFC}ov4h|(BalujFXxZh07Au|uWxl(#_TsOY{qv?>5sPoNN37^>{WzqJJ zZ7&(|{IQ0}hs<#g*Fm^BlX+6rNFp}F7P%*a%Al?bZjBnP6UXc$Du`JXG^X-GpS zxex86k6(mu`70>jN6ySDr^h@ECvJ4NC~ez7de0X7{0$(43us{1VFlEF z3_b!b)j1xmxzD_;tf&Y+X$2?Hci3;w9%#A&yW~ z{pXc!GYuNstJ;gKm4}K?%xx&@*Tw@Wve>T4ti3L|HvbW72=vAP6+I+RKYqPlxxf$-TZ(%Gi^K5DL7TqAtDqI}3nsvS{zTLrTq?6A76q2N>G6 z`~oNMncp#?BrRBl6@J4T{~f9gX6<}XN2|o%{hhqr-MH{J+Mg2ab}L{a1p1w3X5LLaYP56jFlD@Rt0M=UT~Ue!|_#b7Z40GRz0g&fN-`C3bQ8wl<5;6LI5!6!m;qtntDFzx}f zoC8A+zgMwCNyHdyLK{)0fLUUPb@+rPSyB8m0@A7n62hQe`3JD@9`FcDy!PpU9~S-w-m$fvm%Ls6Qj%Jah3XISY&qm${Y&; zSq$RotoW^vde@O&Dt1z|g);l%MtpRAIXKHZ@J*MWl^b|jmN`HOti@AY3iECJW%`5XHk z^hx#=7|$yP>RA;&)XSe%4hE1N=dOSi^A?nrW2wI#%*`$Eltz#eUdh4n(bt%>S?n$zy?@`-48jN}v~_3CbW%q{#b9mz+-^Ui2%g0wX@Gs3dwh7xL*j zR^9J;+&6Ao_E9Ula^ojNYT~a|n1;Ccc>-y3YVhx1`0wTwqiP-4psmWV>_5?U zH<>~X{dqHt8QSOBJj+;2h5*?=z_z-?-ZvWmd99cy%| zPSRH!{J3T6P+2Be1;?)Z79abKJSOJvF{2A7m`>N; z3m!WSHP}T~us6eeSfYL3F@26JtnI>0e1v@Hyj=H%D}KD#VGZFHWI<0NwC$J2)Cg2? zu@J5Cxj_#f3eGwsMZfz}a?L6&`)`uZeAAJx(hmpkAB}PPJiH(Ge898KxnIF;Xmipp z=E+&gKr_9Y2-S_!1K`SXrh2!kn>SDB`ZVmp9} zhb%hZ)gY%+XUyE94!s7S3tbk}HFw9k;fQQxc%hM9V|?&O^ng7K!tr4(L+!OymzsZO zhQL(&TOXRTyBnWmZe&kg5bbQUQavN=Y`}MR%>Ny^cl`UTdbcA>{WaSMFmcNBRNO`t zM#RcEYWWsiW(_w@jS}W6IDci|O17>A9=z68h2~)N*Qnv#p)!us`HY!|N8H%fV5Kpp zNY|Q3)O%rQ?j8Jvu>ele>k#uDT%?8jy-@9~K@02w3b#@PL|q~Gu^4BcuWCy@c#=$I zxW`CzwV6jl54hGAEwWJ2O(T&8ndXnLwEY$@hi%Nd757bMW&UMWf2MmZQu zl zd|~^j{P<+@GgG)X(+mymSe9MWSue97y!D4m;jNgghqpli8b=IKN@9|i?8}+)xU)y* zthV$Y_}^%n7&WcC0tkx_Ih(@*^O8KR!G?T1l^)57sb5xwL^E|mYfXLYenT8i3A24h zkSkmVOw6qawR!yPqPrU>zS85`)dg;bx0ZaQuIKyKsQuPmEIiDUCIe+I~Gb@XSVekWVmfT&`i5xYl(ow{$4>XEG>QENFHAZFoa5 z1SXHog&73x(C{D9nTQR`fXS zxV9TybI|2!j+8x%D2N2DIbhH!_^O;>1{cMLXt=1Otgz>dQhGA!4lsND@ zfFlMyqp3)H67JFdYHXdUkyDQsRplUjY83A-6`D-I;uSd))Q^=q@AHLA%>=#`oxMzC z5`SxPS0iy)uSrlS=UG0!PZA$a*+5r))x?QvsYZlpuRp>FMQ173>q;A@$43WaQ9wG} zr!@)1QhnBn@PLJauo^OJ9|)(UuJBfvEi?g-Pdj6?l!=I#*r>{(%MOmIfqbsAlLELE zjLE0ASOxfXW5@lB=1r5}x22!h#wdOTHdr&ol@EEQXpEznDitL z*LVCIkvzUDT-3S#t9)lL*U=%p<}1yfY2 zNTDq%rOza@`3{C2yQ*7bJ@?n=30?9eeN1hv2paHP*dscd1OC#PV!@cl7Qn+RYB2Tv~ASE9S*gqImSnzf*>XmCs zR^Eo3AJeb&({-yl$oEY*EF0-vw72BaYpOj0C0d3m50fn#j

d)ZT7G(FRb_n+vnb?>s%mn_zlq(2E@=+YG{T5AE##7d>B0q;hMxB3-V_K)V* z?~l(!9!CkSAs!ruFm(NO4zH4fH7N$+JXGE$V~4Hrsac)@r|^76b#)QV`hvuDKWcF= z>xkWeSW7pWdtIs-P-4Vpvq5$mHs!17c;w5motFGUsvLdzg3?veX*PinBS#R$LZ;ol z;0oXRsm>`bqxnbU8FylsM(4J47-?7r=Fb&}8jcUM%5R%-TUgU%%4kDApr15VxP9+j zwScbP(Wl|m#%{l62Wu2$V^P)YVxg-HYA?D;Bs-s42+i3Xhe-liwSHy?Dz1lL3CAdh zMn*=w+vC<19*n{{@7}N2_HD&sUpXYu0ko8x55(P=#t*uW7>ggqXEcE!TBISlu43S< zXm6`vQf+FP!R9>YJ^oH+?&3nUi5tefRozeQYE?dbawU3)rOi14uw8u@rRk)?b=Cb0Y&T@kQ$ZU&fWn!eE|6$>x(a$t%YUnwISGG*5LrLcFsU)dV?0vaa*a(_6r>B1T-+Lshwgs`_jl!)`8E@=_*Nnz&ViyJCD6T&_Z z_3v8s3d9}GSk<9Ek)K^X&fy(P8R-CcK$Bx|Q={~9LimVPpf6v@m%-DbqNpAf)8_=? zpJJBtwGqm7kyp`a2&&&jJO2bgBjm|mAgxN~-vc}^zyz?j!9tEt3=R8TfZW^*uV7jR zVH5g0_O!gN0w^8-ZInKliG2__sAql#YVgK9`iOLp?Xih2s0IObZVIkx1j!@ zJFzz|F<#Z2d4EECaQ%zW`7wCHZ41~^dcNZgXS62YIL$((Ph<;YTAU$w>E^s4+Po}8 zrzAcr@+jVQCOg0=yN;)XW+t2f;N``P7Yn!BF7n0FBgk!2d>bIpIaC=jOSYEEkVMm$ zlr=2PyGfB*XQap3-!35SvwbgkF*}xK2g43q+QawGd?lZ5X#N@x(PsJ1G#!S8Y($Pr zbgkFFw9OQXQX5GBo+Fh6R*L|0={v}_2G@oHz&Bvvn%uvDZyktHzT_Puy#bYXpr=%} zT#>~rQP#N;NwwI5!Jwf=;wHGd`svL(Z=%`WALfoq#&jm3F6*;eDCQNW zOzFVV>?8PbHu@++CRC&KY4wY~%veE2O|@%{=Dh;~yrCu*tj`~2 z+tujTTVsl~X|~X}Xqneoxk)O_ER5W}WZCjHfuYec8||WKexuPmDo;=h)|JfI4Tov{ zGNHl3tx2qIm)Hgy2(0JYo z=+q{B5c6n2(fTA>vu@`NUYqoFHoWqC3)$qUIl!GZwws_~OBv^f0!`Ku{@{W`b1SF5 z-kf?C^)ag*=vgd7MNDY1VGC{Zw!rdgUEa4)lJPUYSeX2&6HwxB7Rw+&@}82vk}B`n zApN*mc2`DymjlVIks=67SN4ffNGk8rijVA$Cz=%Q6s{j?r$RLuJ#Wn1C|G2VRH7d zdSQ;h7Uy`1zGjV})Dd@HUiit5XO96Gl({CEY`xCPY9ptFvp8)Dq?fa5@r%hEavK`F zsPlY%ijT}iDE(9*z9Y01PUxSvRPeuEC3yRDn1eNW93GKy$ZKTb7T;rPm4E2$wunQ}iUtFAC; z@AoG=!SHu?JiVpHBMHa7Syn3OP{gIt9StFsJ%A>5M~w?z&-)3aC|$Vc@<(iB{DQ#b zg?IGyKLT}@VVTD|3qzMTwi@z<9HagwWtYI%N#g*=8GDj`|!{!TX*#0jVwk%AbegqWJ_WARhh8Z7g zbrT%(6No4m4lcr@)>(yyEr{DGPq3q8`S)x%wse;w`RWIL8LJZY&{;_vDFSU6a{NAl zddz7r?C4ViV)^D|RRm=VfXId;q&5Fvh-@E$>RkysaQBX*NyX>lYJ2#`?Tw2Ku+M{T zHs!uwKjhZu75M?>BxX>7dGw+qqr}4`0^ADDX4BtxZ4eJhJ7h ztBgl*nkV)d*1E^Jxn%8yB8DxqINf5e%&{D0wmZJ@?LRQG`Ngqb363DguEIaB@z1ya-TydC{-bvG_iOw|S1C~7 z5e%138vXxSt+=dyobYitC0ws`Wt7^s@r~*a_}kLpW9u%7b1fW4vi2T#+?LN{r2XNs zb*BKCwrDC|EOys`&bK|b?x;Bzcg8Jm-|7BQQs7>gK9~^skJjB^OBQI%HU8PYqz9Ul z4WRMQofUfr+8Tv1nLIreN^X=wX9DwdfuD8|HQ0>v? z`R4ZfNPsyvLYf0kQ|&XBXqf)8<>KJvsFB(RP`MTIee^W3QC3HaoWVtz{S8`MgOkV#;f1R4UyX1g$~y^hLL(sH_s5O#2LO`P7(CziBvj&TOV zxgR2yxiqBL3b9C{D@ty9xaeB}D4Vh&vbrhTtpeWyHi$mt0q^brA|?FE)T`?4k>N#^12c^~Bnr4+c%4DMTrT0TtpIS&^DQsyFRJ zc$Wq%b0otw4rMcfltVy7+bt2MfXL>LJ?uvQh?Xw9yQ$m>Ze~=jByxzaKfi;F&JEI6CQAF?9*OO9GxsVcABYTvoq3Tqlzxu0` zQ$1`{f;oizRv~9E~|)T$J9yM@@x?Obyy2QTa{vJ`#A zK+Has9yV{Utt9?&m^Q^5angU4cl{D7m)nmTtfMGevM08B_g~8c85NJ^f$>HlZtq61 z8dxUrPyIO1L1O6!;$q7Ct-gV&(}X9`uE~*I4iCsUBa&Gp58y1_glLPB2hbHsF;)k_ z-cdG*Bvea2n1S7l%lSgJL=YY{2}%kN7I{Q})K&6i$&I;2SFIslI3-nkt^pQ+p!7IF zr(I{M>S1v(D{rOkcShb$VFhFMa~C^)_I;4SM_#*M_2g~#0efPkh=P(b#lUD1QRlGH z=>uk9V3p4dthu#2fd%3s&tA)x2IP_atxs;!aZGmp6>^`vrl`KQi%JiA9#T zut;Y|KWD|E7F;1WLwbx#(vw-MA;0g=|0MWxWrDHEnE<%XWWurCav&hIWzSEkKgEub8iZo@_%mb{ay!-T~KB2+h9MLKi;GixExm(lp-U;1|#nf`5eO{eXe(zOr+xSli$|M==X2z(`9-D=p-MW5ehsn zhBWwtOU2rKe-x`CYLa+cbYs*YyrJqXwR`N>U=nKlE2MGA!7nzK>K$Sa_A_~#CEN(}_JF0cG#~uRw#1FGB$De)=`d&f+ znqLX6&5FQFM=+$%)QJfCZnz}cJQ;(%ej>pi`xZ8G41vAi+C;CcLuIKO`|;2o2bUDz zQ^etLC!?64mPb%)+-B5q;6pLLr8vmU=u4YEEIj!T?T*pCG#YpkvWelcozxpAH4ud|C4#q3UJvhzsK#r?tLz=BEpQxlf(Eh_{OUtq zKk*K+5Q}$gVn(37fv95dW8wc*!`J28Ymq%@k;lpvXAJwsmI6JQr zL(g{EO^(;~U=>ZV)L-htaToM^tI8sDmhrwN@o-rB<6bG6bOZDnT~9=Rs$5%8Hg4Yhj=MU23Ks;G5uuh3k5T)7*n6v> zINNPqJGgXkXb9f8yK87PI6;Fu1ef3zoS-2DNw6SE2;M-D;Ee|h5TJ3F;O?^Dd~<$t zX0ElX);`!(|9`MgIHKvQ=IQZ{=N{v}Zo&P(UQMQ#jR0XRJ!K-Ruv?so&A0VfW~c#m zV+zoW#YFKh?jC9=Fb)^tUl04%y~exibf1c04GK4-q`e`EUSq zsSYTbvULA$n+AkJ_vwZb=CG+CLhea(#WY5ETyg_XBDMp1qh>^|rkFcpDH8c6Dys3r zfYcF%%NXe5>qrCN*D(R+s6SjLG*!FZE`Pin@l2TcV6z%#vH*blbc(U^?g`DYgD)z4 zMOG#e&eTtmtFV_|oVY_)=}(uNEPA?v$UJP3A#d?MA|UExN%r1cE%x2E7s!ga1QwBw zgT=mi;CxyEC%NCj^)&Xc2ue#CBer|7J@z<_Eh*~WwK)#S;Y^;onzZ{eQSovD;JdV} zS@lb#-b7_L3|<$iGW+5h9z+saN?R|ct_911 zP*i)N=>sF>sC(SO@nQMo;YNIMEHgbdbho~D7B&OG-g}QF`nzambKQ5;P+;MSKE8>1 zU{Azn=BDGN%yVCy1`#IR2{2MQ3ZuOzxpR0&DdH9>ecMT})?y7`MMpN_Jpb z$$O#AX)wvb!-ef<=Bcz{An;;aq#@xnYp7_WLnQutex2_Z`BIl2e7ry*!A>V^*!`P2 zV3Q8!lL>d+G84r?D+xc&k2xsnNn#=nRfU!ozltXR6P9#_6-estvXcgUas46^;D^%! zzCob%a1KjHdEWOb07uUF#Euhi2r!JO6Wf9+O;;N)m>jgF8^utr{`)O%4z)Ps=EFhQM4# zzwL%*+TbF-c(;>V(tPelrM`x7*ZAwdcL72GY$}@ih!UGZ`o#Xy*?SoWM+~2Y->t9t z6ITmn=S`JoANH;+b0*nQ=saK*>T>=`_#lW)9HqzisJh7FiJ5h34=51Qks-ud7 z+L?YAInBvmZ&GNohyYI| zhhQOPFXt`+%u?pdUrQzK0)&>jMshBQOu{aMe@15_vHI*_62PFzU&^!v>Rgjgl#^4! zBMoFQtO=wg;5aj{AZC9ro@mNBF@FmoY$+9gYOPf~M}oe_JMwx%pzEBzul2qA(K%69 z0q{@IRj}`N0#YuSISj}$44)1yC(~JCv?OxCaiu*Jx-QC@mgb(o$@=J+7}iMc#To_^ zFz1+-s6{dT_~0M(G{zS0a*q^1#%ILs_DCAeU+lzI#KKz8Itv&PEOckp>mL{XxW>K2 zd`N#_(%Aq@dPxld`;2m>HrFIK`zp(3LG?<{TZ#66Gh3V|}0(p!Sa z`wr?+MR|U3#%~<$yjgas`+GyovngS@M2-^iNdCvu_nrz}pz-|)glDHRNnOQ>41@ZF z1-|$w5Ss-0Y=fS6O;oyldU5!v4WDFt>+95oXJ;()g9v2VNeuHBqjT>YWN*H$n%`%` zkqUZ}Xqrcs0-LeRN1|M&;!|k^#Gjy7)+TxRF?m07?dVyY@aZzAbFTgqx*s6gr2hlI1j*a9uNQay3a zfIlB5EPp*rs6qhax#z7E06aqth&pD#Y%B!73JE+U?D5fDWuXW9YH$D6(RwWA^H(`d zfe!mq#h)tor7?Q47RA=#Gm8ve1p99*m?wWN7N0ombJS((0>{zHP3e1s`Motjp~T!` zy$~82nQc<2rJyQb&#(G0t=4^gCj9Mm;ex{RWKEX|Qk$z|7Z`P?(vq-h`Xh(>alCTy z>y82RccVYd$Vw}cDf7Na*Y7L*EPh0A>%0z>hPT`S9e^)oTc7;fu5>S|UgtempP$PPkrh!`F;$~nZ?RUk-- z&FXcxot-OYwdl#}1)SsC=q8LLeTZ%>N>3>jsh`cBk6Hl*L#M-<{O%v>$-&@nwtRlO zE(nHhje?uyp>AxKWUe*8mw*6-ikOMb+jnjp(_RlJJi=z`RbmbQb!RBcQqj4j|7Q?c zV@y3GB!8m_7Y+H>zbVU}5cjnkv$#NFJxJdis2+sVeM;^D!nPL^KTMRr2_NbY)Lj^a+$%k_MmM#b_L%W%%00I+>5DJMzBxEs&xZP%OS zpp|78r#S%&U|(T&{P3AXtfG+!2Z!bLu;UepT4`4|KU?SW!Xb6%YwpOUxnZPCtXXPa zdQydKV%ON1ajBzUq<=QPPXGZd(H{I2TAC#L!wWM_R94D1fao3b>MQmPb+=r6R9Qkx z#Ttc$VZ)+spGwb;_WHfh0JWr^-&t8mnXi66fZ-K=4n&BAM7Z2O{AdsonTTzViKqoZe1i*xu>I|(JsT7d>+2(c=jpD5lSLpgGeG4I5> zQ5d8?*%JJE@u=w(^~=QvmK8#HZP2ReK+t$uv=wC<{n@)gI(>qlGPqsVxJmx(5-tj= z&&{hY%_*h?s@Xj3A36L58X%D@b-{B&$DKN%qPFPyy>0P;%eXEw@PIjyX4)Kj4>^2~ z@3*NIy&l6Exzw^MZ!z(b$>AgNcMY*pYKGSrI-&VMYhXFh5)cR!fh3?l(yUieNB39!U9HC6PJ$IxtVR`JY@q)Y-JpaIeLa%syxs{3`>DoM+dBevRTFS^e(Al>pCoBPE$ddBTSi159K%kE{Qf4Zmo$ zkgy{_h{-oNzxB-|ZA<-~;$&cOpCHYvXvRj#sUg)UwUv7amNO4|fQOE5TR>fg9v2O# zf3LtiRNjFSIN!PfG}K@UO`|_+AP=BrDhebjLxj4F+hJyH-yg%EQt0|%?0n2*q2Grg z0ZBRlJu{vzjVs&{*}s}(sF@ZS$_j+V0)d|Llx0-;JgbFYVHHPSf18<6xB=zO7TtT8 z`ph`@i@)T|awNF%YdweM2m^L1bB&jRfs+&^>YTx^Bmp9BvEOC4JBa*;F4crIBjzAL zX7A!!Wbf^?R02EN*PI&I0{YrsyTw-0Q|fB`{xyO`(>!D64^tEE_Lk-|xaPwaS8{Ui zPgaj}-aqz_<-MxXBYC$e%2)b2=^V{@)7+r8ZEL_ zC@E=8x`FT&={@Rok8t+Dr|XsLr*TQZ+g%gng`C_22(*Veze!sfztuq?3g$obbRqz! zH{1Dd6du(-QFu8605)vy9xnV}uwlQa3%`>)eCYq3P14r+8|=sXFOHf~^glUj%m9LfZmaKjGyqQz0`T+>vO@1ecsX)X@v8^D^;`A#i(?u?AUzDPr7c?~ z3x+SoYL5V^Joq;weOB7Gse0i{z;70w^KTZO)T8;oICd}oWFo4@1N=Cmf3x4b{>gsx z2Xyf-UiYAd|H5ti|I=yui-tEk_s0q1;RV8E)E@qeAU6T|2SIKd7&d*LxaAJ~FL=QJ z_mTX+kA!LD|D6)L|Bt>n=b!(=={5c#B>lT^|GP&2-!8iUh~x7AKa1m<`y;{Se*?7p zzx}Mr1zfz9D0lBM>R4%1kI!#BXIHQ-%c-mf>{z;-rgI9&qpv4%a>QEsXcm9lf@(`n zYSycfZY0(Kmu18`Kk1bm4bzdf5OQ?ugKc?&rLV7ML%9q!+UwkLZ~M$TP5hUEX;K?0 zE$twd+Rogk#mthfcINeoM=*-Ae%nrb4`DW5Qg1${o1va1vSVV!+8jeCZ@J{2Okh^Q0#W3FQ^W|+Y8RR*%v zWzoqnE8!Z9o>BNf0vz^Y(+nH-k;my;wCO}T<{u+cX?KZmwQTy|IbTk)u2t}A(lFOu zPzCBGc2(cQ*d!7Oy__FT6pN~>1UaKEg{JZJ-l?+hR`U2WVCz_Pt6vur(ngjwn_}so znaj^?o+y+W_z+-=w`^iSEjZ@?#b&eeyT;=SO+~6$weIFj*T}!H3>_OZ|3Lv9AH{iC z;!}wzc8dWa)0gt}1CA~`dzY1GeM#?t0KLxOZ}<1N5eV?sN6OK69Lj>Y2?`Wq1z7RU z6rqwBszEA`{xQ(Ta8Dd*uN*L+tBZc=_;GkL30TH^zfd?hsV3~P^asV!=801~9adc7 z69a2d6VgM=P@FjVShCJAiq1;SPFgUBr2&g2J{<46WvBoas1WuzS-|KY7{?f~@P~PF|n}&FVIq2;?S30F?GW1F~kfYph>f5mL! zg3Ob}MHO2nUY0V^m$e^1(ioedBHGp)WMoHK>KJ_Sh-gn4O~(+7 z%H#! zaqZ2cjvl76S6f{4Q=EsF*P8#X$CW)@mc=(LtqUup4X5#)V!?}7j%gS~jnHmsMCyxZoC3g?WOxA6U%qw-Y!<%~{A-xJL(Eqe9a9 z>FWKW&IrSGZPE1j@yZR`cY|ooXdW5MQIZY#zn}UbB3vcXe9)L?v0U6sy0!RDc6GEx zIJ*`_WEBd@n!C*gj3QrAp^cN92KtL0e3kF7H$89;O0Wu}tQ5<5-|n6~d!aFwa=1{m zW+G|O6+9kK@|g%X^MG(Z@2SOzV8znpKCy)M=3|A7^hbIzyMnKAqui&yw(p*IJV*KF zL@+fIo^$b*r4Fsyy(T^|E8>lp-dWQq8}sySLU>d5=+D$;TzKtCukXVBr_b z9lN@p<6^kJ+qAfoQqFFr+9U%R9HK9JX8b58dEL6(R_hsRY(E;iw078SBa5jIuCz3R z=XX6kphSGj9{It{G*3&Bp@(oH4}flQEjXE<~Fe-)YVQK{T9h5#NENukie z13^{ka?O~)BL0@G#imAlqiAvM?zqpx7kv3Gxkci*?kQ(aQdnDJ!v}+OoOz9HZd{F> ziev@P^_nqiu5CHq11bsTO2`uzb*K|X!w)8PF|IE3hy(WpxvF2C?!1DtZ+%%5DuX-Q zy#hlc9Ai_vX7h%Yqa>)O+a~4tX}L23QX&lIena|PtMbiBhczmPv@mU*BoNPNu zGt+4Me*I4AlD;V8$EnS6x5X*>@!Du(ArWH4OeBv`*CiYW7u}(k*mXiyGU&vh_%8kMm%)F5ZxMt$?0RNNjbe*B#rifg%^{O}U_D`l|XT~mh`27oot!Y=MMdWXjjImzQ^c&-A38FbIQONcZww+6u#~54 z8;KP-kx%aLaa(qt2w%|A< zA{v+zWV33inJf)8F|RC+pC+DY%4Du58im>}ya9U*Nhz1LIu|a^eD5Hxf6OI@s9e#K zM05r_+gRTU33@M$jj7UK+!Eflp~Y%VP58GMiD50!=)|mzaOA8=n4$G!LDsE!eqT5VZ;LSr0*GTsF3h;B^y~@e*WeLXFbfP5dXS*esa%VXar67x` zJ{{_DJyNDPl$K3&|1Y^LlE2A+*11bfw3Gx_AcGzA*_oK#`hyee>m7PaA9WOavz$D- z2t0!wH|HMwV@~O#V1*Zs41owXQ8z=Cc)3dV=h8ylr0%}e33r!|s>ad9=$L6Ne-)7l z>WI5p)Gc+pI}vnMD;izrx8i3%%^;|F_K4Ep9(li$5>`dFCn6VRk^Eh6Wb4Gj)ZL1k zI@%6<@U5CJeoJlQ+H`7CHzy02k-S;IF|BLL59zC(qC}3h)eYiR5d#dkg$A|fIPZ^HY+4@0EfwnqxjHYL1>GT`Q;|Fw z7>)M7snAbYo(ZNJGP5a+dUEGq)HMk+f~_1d;Vcl7njesJpp!B3zoS}dDR z$I7Ob#)6a2Wu=6($DG>`<3cZWhFo0n<`>!&00qkq)Hw%qh%~q(o)EI+=1(Ypa>S{TiBxWoBxz^!}z5tAR{kNX{e zQc%{rkm4s=^SMOi&$uN7Vd{n$*9Rety4@TRC#h>hy_=LEKM#pOj5wJ5i?g{DaOWq zM}OcStUvH?*59wpN!-Qhvd64CN*vJnEMVeeL>F zfpj@12$6{njtM^fe8kN5VO!Xxdvo4tF#YZZhey%wwvitQI$lR#>DYR}yf)IkMYUn0 zETKSR`7s!4J3?BC^~mn$GTeWZcYvV$GdGctXE+-AuZTx|`*s=iGSV+EN10lt4@JHy z`JM+(hS8X5)GoEMSbi8xkp9jQX`uD+VfBF>{UUtW$wAU$N`b3BF{PaJod@NZoquLU z($j5MjD^tz*aPP0v(;|Ryg$riJQw?Cdy4u%c#;d8fOPtJL6*Kb@_-Qov=X_n`x4DW zpjf`LRs{PflNkpU{E6G!*NPW4U2PHjN#`+DDYcp8o;e=2{yPqHWZs=ir%mB1B_@^4 zOa5N@M`|=|eFO{et$Eqrq2-$$a5gvlfkI%V&S?Q~enJ2|K zxmj%G-@5?D)OA!8!PZ>(k0^cCu`#3H*c(jXV}7gboz&``{IPzYzpn${Ue-#$fSGNn zEG@>PHK)1BZGwX)d4rjatwcZAa&`(Gto0*1aV^a=xqVbwouZxyHh~C=pzx>SgGx(p z&|1kJ_d1jA4uYQ{EZwzk2<6Av%wc7g0UH>415`Rs-HknPZ@wvO_}oM}#xyXE3_$$p zL=vBLePe(K4I7!;AtP`_E!MV0#Klk?=Q>i?v$4_@LzC_c zX}2`U@20z0022}quPJI1ZpJ0La{8oss}pUC`0FGW02b>^^NCS7A7jS6rAA9q9R92$ zvBQ`={1%1ROkX6ad=RH~;gx)jJj4jve{-T#<|fBfZv^#ujuYGp^7fgJPb4VUHe2fBs zmR9lyRKA)k#!?S?ut&mwl?_HXkYHkIi5L5yIu($T7Q@wl>5*NYtt4}ln?BAPjiOJJ zHQXkU(c)A@nuCKN3N^sc73z_S&ZkK$LJzH-iuB)?oS&?TXDo8;)rAZ%0#QT zL|o5<3rEvsV&2C5H1{kEbAQ;f7B*Z>`&z5eH@OvSHl2~Edn-}8q%C`!63?VF& zqEB?IjFm=0@vU-2u?;7)AxXXYL87RF&PDy!j~*>ZEk=1|l3Nwhj4AqOnJ$H|pQ4k= zhv5_2v);wIm{RSYop8S!3|2ondZ+Ts;Cc8?BBZ4`icy=i?E9m{Aw%=T5Ihahf!Xu~ z$xz_JmH5q}fxrHhqY=FX(s>>b4(NbEy`z^-(3lKjObAKAz!NcG5XaL}zy72=M~et7 z*^}iWMHYs{svR6>Zs<{ddZa^SXE}|U!C~OOPYXV7=7oB<&_!>NZk08yT|#}VV(F~+ zMYy$(c#HAlypi$-84QKEajj;|OQAwB5^oNXeSOHMP@dD937eg1D!e#G1s$?8IHB== z?QLc3#3q>87Fi0B$mCNYQ>-Sk{D^tjB$-fxLVG&Sa@j}r^Z z3!_5FE0!1L^xpgEQ>-Q5&M$<%N&MKa)s)m&E|q!@SE}<-QJkmYrt>}^a8CloNlHkZ z9G;dCHwfc%D}XY3xu2WyUaTbcN+DZD|jVJ2rx)6D^$6~>I^NBc{gYN}<8 zX$7@Sp|v2(s-S*lwXF6hq3 zEMM_n(afJ$pyk0eVyJMdZ|K8PT-P`2>$5qLX61*TS5LeJ=|45(f95+HPf&OPVs*iJ zwSxp61s3Aet_9Ix3w2541p^uk99fY!W*a;`F4lRDw4Lu^c@oM@t1Zu@kvC`}?m$l# zC*6O#E$eGZy=U5C#T0$zty0NGRT>x%ah-n56!5@iE@Hj|g_b&j=w~V=bQ{i#v!?ib z6hjwWXcTNrTrg_eZFG+yhBr`WmEan*VqRt`_ksu-J_%BqevHy8f5QSfv}3b~820lW zBSq{{DZ=bxA*`ZE6dh+~Z!y^|1U7A*$~8WvC|F(8|$!QqYm3@Ug_+faCz7klT%V{k2{e`J-utuiPl8_oMe$UaJ8R zCt7D05_545dd?g?oqOj<+7P0 z0oy+mKjLo}VN(=vl!`yMh9>z5neATl<47gqv#(w~TrOPc{-tJ2Ab<7J(1AwL?>Uj$ z&9!BZ!VNJ-ERovPCEu?!!w7`T&(!mL%(Y*WUz{$IBMf*+mkG!dWsPyP1)eB|QVjKo z#xdjF`MTx^QlMd9W^8+M^#+@t!%Bc^Rwf&65F8*P|}Hq zTRQ?~$+9N75q)PyzUM!b&|s+;$gLpFPLZN-w*f=_Z>a=I@!2`-zPs-*tJvePKL~06 zo~HlKdX^m+2suMYiuEc!ees3MdOH}+Cru%ZIhlhc15Rfybh)4$>v-sP%t z_k~06KDQGXcooA-EizTrYU>b{Jf=q)o}fa`SL!byJ6kN;4T}FK?@vYQ zh#}5%9R~3J5*xn#gZJ05G{`&qJ!RDd;Qe8NaqneqS8q;A0dQ;6XPZuvH7myX^`3$= zZD0fZvp74pXAIP7P|&bJ4{Y!6itrf)M03!hyFmy5F_ z8vELk7drLk`O>NuPkE<^xg)yLL|Ew4_7Dc!xKUBomP<9#8_W83jm9 z;;Q*E0QqzHE?s6rX@Dy z+@U@YA4WDF5bE@kSNH9rZ-||Rqu|5&2?dr91l<$QFu3I3mb_4dj2n>KrAm?2frP3x zofzYg9iybPWpw7-$A{DVsFl2MU-+feQ)CQA9RQb>tuB-g36=~o1yLw4V?!-U`QFf9 z9m7Wa6PE6B6KOB6jk1_Wi@ffa_m>5<%=>o@H8t}0gnY)ONl9IE0_Rj#IVH`W94)o#|zxej_VFA*m7ZY72o^Hps)h6Ro&S} zzj!*5^nhjS?Io?=)JTN9U+7`4Q7=`%tBMsxD>HZHQH=Z~1Pz3>?k&dZELR+QK96qr zwGUFV4es-MCN2`uO7!%!tiF5>@TA+~w7l0TFGkeQ^3VuZm1O!fMNv8iRGJFf3&c_~ zCbu6l#~#;vd3F_WE#5q z)d21GNzIp=eIF=SCJIkg+wB1Z(#@E?=P#3bB9H~^D6Q0PKP}DT5{-4IlAvFN#&?PV z5_~LXt$k#(Qg%0y9rKBsgMc)0Ogvm)h;wAMtLyZxPW7bp=)Y?~*oG2=2+><_b~xC0Ye2@#2>yM7S8Vz?o> z!h?9}x2Jsy%KLeodM~JM-VMY7!ND>2h4D>F4ZZ@7=LT*(m8XSGo*gj;ODqU~LLZHM zmruhb5>x4Ymen=~Ek);bqvD7Vx_af7?J7!Qrl%6PERN2#Hcxi`#*UZ33xcMt8WU#MoH9hVgK%9mZ12&SxT zy=gm_eNPe76QA<3X^8P%1EU3ph;)eFXcLt- zZC2PVC_Yy|-`s8Gf#tOUxW8e68%*eq?BxR^=@Op%-bFe-alB2d`P%;VlfumnV>OmAMCrIJ^$#MBkzCzAbp4S z(>0EY)bN>driQ#y%+_6Wy5$4|PEIR#_0c14h7{JQ%syicaX z%+xxJGQ>fwdudj^Iahh5RE4z~`=Z?1XCswRC;qraJ@AAa!50gpRvFG$Jpl9fn(xbN z=c|55`BQ3Ev^?@;T{ViY;j$k2`|0$08QNu_?OL+(DsEDZoJjl`RScMJ)yf4MS8kN< zl1hM@b%&A2w#eZ&9on!}11;xU5@+C>T61C4@~)%(?$H*NUz(j^nDDx+u-_-lsEi{R zhBT3eTH%kGJ_vg*a_(*8$DIPHCg}$J>lev0ToIKyI&wdQg&?(S@FjP1g9aVZhyguu zC;HSFTPlKUU`c0`r`oe6GkJ1gg+di zPF=9*fwRI00_ffk8+q7cQLX0u#bb&Wu(V+0shMP zTI~A>C@`LdFSLBd7e96vNBxwJe|_`mgTEP5p~h4vfn#WZIBG=)dbJzbhv8)o4pn4~ zQ{)p91ymAVbedEXObS)L9rj;O%>J3T@5t@*_MZ zI&ZFfL1BaDvIhE)TI6-KP=%!5%s*~wtprZnuA9n!7$u*fr=12FUUlW^+YZ(7VPD9t z1_R!FP<-5lZ#MF!(aX;iJP8pPMzMo-w}J0Y$Q&XK`qI|xTtDD!Hh=bot@4}lXOY_DBn5|WCGDsM)lu@o|C=W4~Idm%dkq!@PS>sO9 zsu^7u(Ks&`4bggg#t2qFG8+UPeR*?-_(k%-a_=6S(olmf;Y1@>zK#u*jRK&i$SpbV z7C7M2X1_`-#M1U-|1u>GG?upl#rWbPmu@1prX=den9LjK@=dn8{eKN%C=A5atY)~f z19uk8=m>`jTHV=(`Z>**iDB1r&{Ceyh6`nIA#cjy(Tm_}eD+WFPr~qQ+;&ojADr#G z)qVx&v>2p4ricNvo>+7cGj^@p&q@n!PqC+)I%DD&iBihsb%r;bN!}?b*rhXRFa*g{ zx}5e>-nK(OsVdu}4=aX2xJ}Yo_$8czNaw3XO)PuH+)@e#-=RAfd$lhfK2=gXFwl8C z*q<*&rx)N5MzO{S-W=R!AlVD8c*7X!K@pct)CA;B`hCn^X)0=@8WMULpsG$k*h zZi}~RNG;b^E+#eDF+n|k+@v)#zYazA2YX?gpI4w@y{#eGA${DN@W@etFIc83c!!_l zeJCQ8@Sk{-^n|=+CHdJ@HeB;-9RGYL-#X6XV5r&nmDb;sz;^ffCEj18Qi9?1DOS&= zb1tf$q`yvT*Kvxz;9j9%pZHu`{Zw4=3zmxxNzr!RTv36bDkf%z^TQ08ROVl{Pgl27 zijTB>gR9(dw7VZBrY9-RNu2LjNLPzNykEax^a>G=f0&z5E5Gm)m7k_gHt?9#QumtA zZ%0BDhnEFggxHcso2co`Ia|bG{=kJb$(QNvIO$r8Fvb^QQ<`!jBcRFB2Jm`kHsL4K z-vsn?^^nkv15E}JWaEmi_lUX+T?Ll19elQcV?OQl6mxsX{_rQ zD{88LX|*z~9K#shLNyU7Xv-2y)e4>J(2_|1jGQcbFWA%6o!l6NmJX;9s2rh6 z^5?rtd>~(dw`le&B)ceHgGBD)E?vNqSL1wyB}uv+<5xycTDPUg)OWhO zkT>l7M4;qBuwcjCf#8#Q9RkR*mXoTxb`1PvvW*&;m4N_Ch+n)cF>FS6sl%k!<$ z@$1f5*=VMs$o~rq2upN(0$>6AhtT-)V9HG?*qSjEJzP5zCRSZUI#Q+i?`kS_v`S0# z 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

o)*rl6XO<_k#rWax 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≫g4x)`Soa(`{b?`~iMt+^P7*q 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.0 - * + * */ goto __pyx_L3_continue; @@ -2534,7 +2534,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * if target_index == predict_word_index: * continue * label = 0.0 # <<<<<<<<<<<<<< - * + * * row2 = target_index * size */ __pyx_v_label = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); @@ -2543,7 +2543,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume /* "gensim/models/doc2vec_inner.pyx":153 * label = 0.0 - * + * * row2 = target_index * size # <<<<<<<<<<<<<< * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) * if f <= -MAX_EXP or f >= MAX_EXP: @@ -2551,7 +2551,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); /* "gensim/models/doc2vec_inner.pyx":154 - * + * * row2 = target_index * size * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< * if f <= -MAX_EXP or f >= MAX_EXP: @@ -2627,7 +2627,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) * if learn_hidden: # <<<<<<<<<<<<<< * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * */ __pyx_t_3 = (__pyx_v_learn_hidden != 0); if (__pyx_t_3) { @@ -2636,7 +2636,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) * if learn_hidden: * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< - * + * * return next_random */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE)); @@ -2646,7 +2646,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) * if learn_hidden: # <<<<<<<<<<<<<< * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * */ } __pyx_L3_continue:; @@ -2654,17 +2654,17 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume /* "gensim/models/doc2vec_inner.pyx":163 * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * * return next_random # <<<<<<<<<<<<<< - * + * * cdef void fast_document_dmc_hs( */ __pyx_r = __pyx_v_next_random; goto __pyx_L0; /* "gensim/models/doc2vec_inner.pyx":129 - * - * + * + * * cdef unsigned long long fast_document_dm_neg( # <<<<<<<<<<<<<< * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, unsigned long long next_random, * REAL_t *neu1, REAL_t *syn1neg, const int predict_word_index, const REAL_t alpha, REAL_t *work, @@ -2677,7 +2677,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume /* "gensim/models/doc2vec_inner.pyx":165 * return next_random - * + * * cdef void fast_document_dmc_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, int word_code_len, * REAL_t *neu1, REAL_t *syn1, const REAL_t alpha, REAL_t *work, @@ -2790,7 +2790,7 @@ static void __pyx_f_6gensim_6models_13doc2vec_inner_fast_document_dmc_hs(__pyx_t * our_saxpy(&layer1_size, &g, &syn1[row2], &ONE, work, &ONE) * if learn_hidden: # <<<<<<<<<<<<<< * our_saxpy(&layer1_size, &g, neu1, &ONE, &syn1[row2], &ONE) - * + * */ __pyx_t_3 = (__pyx_v_learn_hidden != 0); if (__pyx_t_3) { @@ -2799,8 +2799,8 @@ static void __pyx_f_6gensim_6models_13doc2vec_inner_fast_document_dmc_hs(__pyx_t * our_saxpy(&layer1_size, &g, &syn1[row2], &ONE, work, &ONE) * if learn_hidden: * our_saxpy(&layer1_size, &g, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_layer1_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE)); @@ -2809,7 +2809,7 @@ static void __pyx_f_6gensim_6models_13doc2vec_inner_fast_document_dmc_hs(__pyx_t * our_saxpy(&layer1_size, &g, &syn1[row2], &ONE, work, &ONE) * if learn_hidden: # <<<<<<<<<<<<<< * our_saxpy(&layer1_size, &g, neu1, &ONE, &syn1[row2], &ONE) - * + * */ } __pyx_L3_continue:; @@ -2817,7 +2817,7 @@ static void __pyx_f_6gensim_6models_13doc2vec_inner_fast_document_dmc_hs(__pyx_t /* "gensim/models/doc2vec_inner.pyx":165 * return next_random - * + * * cdef void fast_document_dmc_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, int word_code_len, * REAL_t *neu1, REAL_t *syn1, const REAL_t alpha, REAL_t *work, @@ -2827,8 +2827,8 @@ static void __pyx_f_6gensim_6models_13doc2vec_inner_fast_document_dmc_hs(__pyx_t } /* "gensim/models/doc2vec_inner.pyx":189 - * - * + * + * * cdef unsigned long long fast_document_dmc_neg( # <<<<<<<<<<<<<< * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, unsigned long long next_random, * REAL_t *neu1, REAL_t *syn1neg, const int predict_word_index, const REAL_t alpha, REAL_t *work, @@ -2940,7 +2940,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * if target_index == predict_word_index: * continue # <<<<<<<<<<<<<< * label = 0.0 - * + * */ goto __pyx_L3_continue; @@ -2957,7 +2957,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * if target_index == predict_word_index: * continue * label = 0.0 # <<<<<<<<<<<<<< - * + * * row2 = target_index * layer1_size */ __pyx_v_label = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); @@ -2966,7 +2966,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume /* "gensim/models/doc2vec_inner.pyx":214 * label = 0.0 - * + * * row2 = target_index * layer1_size # <<<<<<<<<<<<<< * f = our_dot(&layer1_size, neu1, &ONE, &syn1neg[row2], &ONE) * if f <= -MAX_EXP or f >= MAX_EXP: @@ -2974,7 +2974,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_layer1_size); /* "gensim/models/doc2vec_inner.pyx":215 - * + * * row2 = target_index * layer1_size * f = our_dot(&layer1_size, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< * if f <= -MAX_EXP or f >= MAX_EXP: @@ -3050,7 +3050,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * our_saxpy(&layer1_size, &g, &syn1neg[row2], &ONE, work, &ONE) * if learn_hidden: # <<<<<<<<<<<<<< * our_saxpy(&layer1_size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * */ __pyx_t_3 = (__pyx_v_learn_hidden != 0); if (__pyx_t_3) { @@ -3059,7 +3059,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * our_saxpy(&layer1_size, &g, &syn1neg[row2], &ONE, work, &ONE) * if learn_hidden: * our_saxpy(&layer1_size, &g, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< - * + * * return next_random */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_layer1_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE)); @@ -3069,7 +3069,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume * our_saxpy(&layer1_size, &g, &syn1neg[row2], &ONE, work, &ONE) * if learn_hidden: # <<<<<<<<<<<<<< * our_saxpy(&layer1_size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * */ } __pyx_L3_continue:; @@ -3077,17 +3077,17 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume /* "gensim/models/doc2vec_inner.pyx":224 * our_saxpy(&layer1_size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * * return next_random # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_r = __pyx_v_next_random; goto __pyx_L0; /* "gensim/models/doc2vec_inner.pyx":189 - * - * + * + * * cdef unsigned long long fast_document_dmc_neg( # <<<<<<<<<<<<<< * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, unsigned long long next_random, * REAL_t *neu1, REAL_t *syn1neg, const int predict_word_index, const REAL_t alpha, REAL_t *work, @@ -3099,8 +3099,8 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_13doc2vec_inner_fast_docume } /* "gensim/models/doc2vec_inner.pyx":227 - * - * + * + * * def train_document_dbow(model, doc_words, doctag_indexes, alpha, work=None, # <<<<<<<<<<<<<< * train_words=False, learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -3132,7 +3132,7 @@ static PyObject *__pyx_pw_6gensim_6models_13doc2vec_inner_1train_document_dbow(P values[4] = ((PyObject *)Py_None); /* "gensim/models/doc2vec_inner.pyx":228 - * + * * def train_document_dbow(model, doc_words, doctag_indexes, alpha, work=None, * train_words=False, learn_doctags=True, learn_words=True, learn_hidden=True, # <<<<<<<<<<<<<< * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -3287,8 +3287,8 @@ static PyObject *__pyx_pw_6gensim_6models_13doc2vec_inner_1train_document_dbow(P __pyx_r = __pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(__pyx_self, __pyx_v_model, __pyx_v_doc_words, __pyx_v_doctag_indexes, __pyx_v_alpha, __pyx_v_work, __pyx_v_train_words, __pyx_v_learn_doctags, __pyx_v_learn_words, __pyx_v_learn_hidden, __pyx_v_word_vectors, __pyx_v_word_locks, __pyx_v_doctag_vectors, __pyx_v_doctag_locks); /* "gensim/models/doc2vec_inner.pyx":227 - * - * + * + * * def train_document_dbow(model, doc_words, doctag_indexes, alpha, work=None, # <<<<<<<<<<<<<< * train_words=False, learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -3430,7 +3430,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cdef int _learn_words = learn_words * cdef int _learn_hidden = learn_hidden # <<<<<<<<<<<<<< * cdef int _learn_doctags = learn_doctags - * + * */ __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_v_learn_hidden); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L1_error) __pyx_v__learn_hidden = __pyx_t_2; @@ -3439,7 +3439,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cdef int _learn_words = learn_words * cdef int _learn_hidden = learn_hidden * cdef int _learn_doctags = learn_doctags # <<<<<<<<<<<<<< - * + * * cdef REAL_t *_word_vectors */ __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_v_learn_doctags); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 236, __pyx_L1_error) @@ -3450,7 +3450,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cdef REAL_t *_work * cdef REAL_t _alpha = alpha # <<<<<<<<<<<<<< * cdef int size = model.layer1_size - * + * */ __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_v_alpha); if (unlikely((__pyx_t_4 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 243, __pyx_L1_error) __pyx_v__alpha = __pyx_t_4; @@ -3459,7 +3459,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cdef REAL_t *_work * cdef REAL_t _alpha = alpha * cdef int size = model.layer1_size # <<<<<<<<<<<<<< - * + * * cdef int codelens[MAX_DOCUMENT_LEN] */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) @@ -3472,7 +3472,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cdef int document_len * cdef int doctag_len * cdef int window = model.window # <<<<<<<<<<<<<< - * + * * cdef int i, j */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 252, __pyx_L1_error) @@ -3485,13 +3485,13 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cdef int i, j * cdef unsigned long long r * cdef long result = 0 # <<<<<<<<<<<<<< - * + * * # For hierarchical softmax */ __pyx_v_result = 0; /* "gensim/models/doc2vec_inner.pyx":270 - * + * * # default vectors, locks from syn0/doctag_syn0 * if word_vectors is None: # <<<<<<<<<<<<<< * word_vectors = model.wv.syn0 @@ -3517,7 +3517,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY __pyx_t_1 = 0; /* "gensim/models/doc2vec_inner.pyx":270 - * + * * # default vectors, locks from syn0/doctag_syn0 * if word_vectors is None: # <<<<<<<<<<<<<< * word_vectors = model.wv.syn0 @@ -3638,7 +3638,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * if doctag_locks is None: * doctag_locks = model.docvecs.doctag_syn0_lockf # <<<<<<<<<<<<<< * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_docvecs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 280, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -3661,7 +3661,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * if doctag_locks is None: * doctag_locks = model.docvecs.doctag_syn0_lockf * _doctag_locks = (np.PyArray_DATA(doctag_locks)) # <<<<<<<<<<<<<< - * + * * if hs: */ if (!(likely(((__pyx_v_doctag_locks) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_doctag_locks, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 281, __pyx_L1_error) @@ -3669,19 +3669,19 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY /* "gensim/models/doc2vec_inner.pyx":283 * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ __pyx_t_5 = (__pyx_v_hs != 0); if (__pyx_t_5) { /* "gensim/models/doc2vec_inner.pyx":284 - * + * * if hs: * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< - * + * * if negative: */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 284, __pyx_L1_error) @@ -3692,16 +3692,16 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY /* "gensim/models/doc2vec_inner.pyx":283 * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ } /* "gensim/models/doc2vec_inner.pyx":286 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -3710,7 +3710,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY if (__pyx_t_5) { /* "gensim/models/doc2vec_inner.pyx":287 - * + * * if negative: * syn1neg = (np.PyArray_DATA(model.syn1neg)) # <<<<<<<<<<<<<< * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -3750,7 +3750,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY /* "gensim/models/doc2vec_inner.pyx":286 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -3762,7 +3762,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ __pyx_t_6 = (__pyx_v_negative != 0); if (!__pyx_t_6) { @@ -3779,7 +3779,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 291, __pyx_L1_error) @@ -3814,12 +3814,12 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ } /* "gensim/models/doc2vec_inner.pyx":294 - * + * * # convert Python structures to primitive types, so we can release the GIL * if work is None: # <<<<<<<<<<<<<< * work = zeros(model.layer1_size, dtype=REAL) @@ -3834,7 +3834,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * if work is None: * work = zeros(model.layer1_size, dtype=REAL) # <<<<<<<<<<<<<< * _work = np.PyArray_DATA(work) - * + * */ __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_zeros); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 295, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); @@ -3860,7 +3860,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY __pyx_t_10 = 0; /* "gensim/models/doc2vec_inner.pyx":294 - * + * * # convert Python structures to primitive types, so we can release the GIL * if work is None: # <<<<<<<<<<<<<< * work = zeros(model.layer1_size, dtype=REAL) @@ -3872,7 +3872,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * if work is None: * work = zeros(model.layer1_size, dtype=REAL) * _work = np.PyArray_DATA(work) # <<<<<<<<<<<<<< - * + * * vlookup = model.wv.vocab */ if (!(likely(((__pyx_v_work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_work, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 296, __pyx_L1_error) @@ -3880,7 +3880,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY /* "gensim/models/doc2vec_inner.pyx":298 * _work = np.PyArray_DATA(work) - * + * * vlookup = model.wv.vocab # <<<<<<<<<<<<<< * i = 0 * for token in doc_words: @@ -3894,7 +3894,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY __pyx_t_1 = 0; /* "gensim/models/doc2vec_inner.pyx":299 - * + * * vlookup = model.wv.vocab * i = 0 # <<<<<<<<<<<<<< * for token in doc_words: @@ -4148,7 +4148,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * if i == MAX_DOCUMENT_LEN: * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< * document_len = i - * + * */ goto __pyx_L14_break; @@ -4177,14 +4177,14 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * if i == MAX_DOCUMENT_LEN: * break # TODO: log warning, tally overflow? * document_len = i # <<<<<<<<<<<<<< - * + * * if _train_words: */ __pyx_v_document_len = __pyx_v_i; /* "gensim/models/doc2vec_inner.pyx":317 * document_len = i - * + * * if _train_words: # <<<<<<<<<<<<<< * # single randint() call avoids a big thread-synchronization slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): @@ -4197,7 +4197,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * # single randint() call avoids a big thread-synchronization slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): # <<<<<<<<<<<<<< * reduced_windows[i] = item - * + * */ __pyx_t_2 = 0; __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 319, __pyx_L1_error) @@ -4310,7 +4310,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * # single randint() call avoids a big thread-synchronization slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): * reduced_windows[i] = item # <<<<<<<<<<<<<< - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) */ __pyx_t_12 = __Pyx_PyInt_As_npy_uint32(__pyx_v_item); if (unlikely((__pyx_t_12 == ((npy_uint32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 320, __pyx_L1_error) @@ -4321,14 +4321,14 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * # single randint() call avoids a big thread-synchronization slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): # <<<<<<<<<<<<<< * reduced_windows[i] = item - * + * */ } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "gensim/models/doc2vec_inner.pyx":317 * document_len = i - * + * * if _train_words: # <<<<<<<<<<<<<< * # single randint() call avoids a big thread-synchronization slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): @@ -4337,7 +4337,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY /* "gensim/models/doc2vec_inner.pyx":322 * reduced_windows[i] = item - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) # <<<<<<<<<<<<<< * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] @@ -4352,7 +4352,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY __pyx_v_doctag_len = ((int)__pyx_t_13); /* "gensim/models/doc2vec_inner.pyx":323 - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) * for i in range(doctag_len): # <<<<<<<<<<<<<< * _doctag_indexes[i] = doctag_indexes[i] @@ -4367,7 +4367,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] # <<<<<<<<<<<<<< * result += 1 - * + * */ __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_doctag_indexes, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 324, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -4379,14 +4379,14 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] * result += 1 # <<<<<<<<<<<<<< - * + * * # release GIL & train on the document */ __pyx_v_result = (__pyx_v_result + 1); } /* "gensim/models/doc2vec_inner.pyx":328 - * + * * # release GIL & train on the document * with nogil: # <<<<<<<<<<<<<< * for i in range(document_len): @@ -4601,7 +4601,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY } /* "gensim/models/doc2vec_inner.pyx":351 - * + * * # docvec-training * for j in range(doctag_len): # <<<<<<<<<<<<<< * if hs: @@ -4671,7 +4671,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY } /* "gensim/models/doc2vec_inner.pyx":328 - * + * * # release GIL & train on the document * with nogil: # <<<<<<<<<<<<<< * for i in range(document_len): @@ -4690,10 +4690,10 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY /* "gensim/models/doc2vec_inner.pyx":360 * _learn_doctags, _learn_hidden, _doctag_locks) - * + * * return result # <<<<<<<<<<<<<< - * - * + * + * */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v_result); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 360, __pyx_L1_error) @@ -4703,8 +4703,8 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY goto __pyx_L0; /* "gensim/models/doc2vec_inner.pyx":227 - * - * + * + * * def train_document_dbow(model, doc_words, doctag_indexes, alpha, work=None, # <<<<<<<<<<<<<< * train_words=False, learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -4736,8 +4736,8 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_train_document_dbow(CY } /* "gensim/models/doc2vec_inner.pyx":363 - * - * + * + * * def train_document_dm(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -4770,7 +4770,7 @@ static PyObject *__pyx_pw_6gensim_6models_13doc2vec_inner_3train_document_dm(PyO values[5] = ((PyObject *)Py_None); /* "gensim/models/doc2vec_inner.pyx":364 - * + * * def train_document_dm(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, * learn_doctags=True, learn_words=True, learn_hidden=True, # <<<<<<<<<<<<<< * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -4924,8 +4924,8 @@ static PyObject *__pyx_pw_6gensim_6models_13doc2vec_inner_3train_document_dm(PyO __pyx_r = __pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(__pyx_self, __pyx_v_model, __pyx_v_doc_words, __pyx_v_doctag_indexes, __pyx_v_alpha, __pyx_v_work, __pyx_v_neu1, __pyx_v_learn_doctags, __pyx_v_learn_words, __pyx_v_learn_hidden, __pyx_v_word_vectors, __pyx_v_word_locks, __pyx_v_doctag_vectors, __pyx_v_doctag_locks); /* "gensim/models/doc2vec_inner.pyx":363 - * - * + * + * * def train_document_dm(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -5082,7 +5082,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cdef int _learn_hidden = learn_hidden * cdef int cbow_mean = model.cbow_mean # <<<<<<<<<<<<<< * cdef REAL_t count, inv_count = 1.0 - * + * */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cbow_mean); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 372, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -5094,7 +5094,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cdef int _learn_hidden = learn_hidden * cdef int cbow_mean = model.cbow_mean * cdef REAL_t count, inv_count = 1.0 # <<<<<<<<<<<<<< - * + * * cdef REAL_t *_word_vectors */ __pyx_v_inv_count = 1.0; @@ -5104,7 +5104,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cdef REAL_t *_neu1 * cdef REAL_t _alpha = alpha # <<<<<<<<<<<<<< * cdef int size = model.layer1_size - * + * */ __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_v_alpha); if (unlikely((__pyx_t_4 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 381, __pyx_L1_error) __pyx_v__alpha = __pyx_t_4; @@ -5113,7 +5113,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cdef REAL_t *_neu1 * cdef REAL_t _alpha = alpha * cdef int size = model.layer1_size # <<<<<<<<<<<<<< - * + * * cdef int codelens[MAX_DOCUMENT_LEN] */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 382, __pyx_L1_error) @@ -5126,7 +5126,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cdef int document_len * cdef int doctag_len * cdef int window = model.window # <<<<<<<<<<<<<< - * + * * cdef int i, j, k, m */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 390, __pyx_L1_error) @@ -5136,16 +5136,16 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT __pyx_v_window = __pyx_t_2; /* "gensim/models/doc2vec_inner.pyx":393 - * + * * cdef int i, j, k, m * cdef long result = 0 # <<<<<<<<<<<<<< - * + * * # For hierarchical softmax */ __pyx_v_result = 0; /* "gensim/models/doc2vec_inner.pyx":407 - * + * * # default vectors, locks from syn0/doctag_syn0 * if word_vectors is None: # <<<<<<<<<<<<<< * word_vectors = model.wv.syn0 @@ -5171,7 +5171,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT __pyx_t_1 = 0; /* "gensim/models/doc2vec_inner.pyx":407 - * + * * # default vectors, locks from syn0/doctag_syn0 * if word_vectors is None: # <<<<<<<<<<<<<< * word_vectors = model.wv.syn0 @@ -5292,7 +5292,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * if doctag_locks is None: * doctag_locks = model.docvecs.doctag_syn0_lockf # <<<<<<<<<<<<<< * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_docvecs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 417, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -5315,7 +5315,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * if doctag_locks is None: * doctag_locks = model.docvecs.doctag_syn0_lockf * _doctag_locks = (np.PyArray_DATA(doctag_locks)) # <<<<<<<<<<<<<< - * + * * if hs: */ if (!(likely(((__pyx_v_doctag_locks) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_doctag_locks, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 418, __pyx_L1_error) @@ -5323,19 +5323,19 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT /* "gensim/models/doc2vec_inner.pyx":420 * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ __pyx_t_5 = (__pyx_v_hs != 0); if (__pyx_t_5) { /* "gensim/models/doc2vec_inner.pyx":421 - * + * * if hs: * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< - * + * * if negative: */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 421, __pyx_L1_error) @@ -5346,16 +5346,16 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT /* "gensim/models/doc2vec_inner.pyx":420 * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ } /* "gensim/models/doc2vec_inner.pyx":423 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -5364,7 +5364,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT if (__pyx_t_5) { /* "gensim/models/doc2vec_inner.pyx":424 - * + * * if negative: * syn1neg = (np.PyArray_DATA(model.syn1neg)) # <<<<<<<<<<<<<< * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -5404,7 +5404,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT /* "gensim/models/doc2vec_inner.pyx":423 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -5416,7 +5416,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ __pyx_t_6 = (__pyx_v_negative != 0); if (!__pyx_t_6) { @@ -5433,7 +5433,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 428, __pyx_L1_error) @@ -5468,12 +5468,12 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ } /* "gensim/models/doc2vec_inner.pyx":431 - * + * * # convert Python structures to primitive types, so we can release the GIL * if work is None: # <<<<<<<<<<<<<< * work = zeros(model.layer1_size, dtype=REAL) @@ -5514,7 +5514,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT __pyx_t_10 = 0; /* "gensim/models/doc2vec_inner.pyx":431 - * + * * # convert Python structures to primitive types, so we can release the GIL * if work is None: # <<<<<<<<<<<<<< * work = zeros(model.layer1_size, dtype=REAL) @@ -5548,7 +5548,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * if neu1 is None: * neu1 = zeros(model.layer1_size, dtype=REAL) # <<<<<<<<<<<<<< * _neu1 = np.PyArray_DATA(neu1) - * + * */ __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_zeros); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 435, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); @@ -5586,7 +5586,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * if neu1 is None: * neu1 = zeros(model.layer1_size, dtype=REAL) * _neu1 = np.PyArray_DATA(neu1) # <<<<<<<<<<<<<< - * + * * vlookup = model.wv.vocab */ if (!(likely(((__pyx_v_neu1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_neu1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 436, __pyx_L1_error) @@ -5594,7 +5594,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT /* "gensim/models/doc2vec_inner.pyx":438 * _neu1 = np.PyArray_DATA(neu1) - * + * * vlookup = model.wv.vocab # <<<<<<<<<<<<<< * i = 0 * for token in doc_words: @@ -5608,7 +5608,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT __pyx_t_1 = 0; /* "gensim/models/doc2vec_inner.pyx":439 - * + * * vlookup = model.wv.vocab * i = 0 # <<<<<<<<<<<<<< * for token in doc_words: @@ -5862,7 +5862,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * if i == MAX_DOCUMENT_LEN: * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< * document_len = i - * + * */ goto __pyx_L15_break; @@ -5891,17 +5891,17 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * if i == MAX_DOCUMENT_LEN: * break # TODO: log warning, tally overflow? * document_len = i # <<<<<<<<<<<<<< - * + * * # single randint() call avoids a big thread-sync slowdown */ __pyx_v_document_len = __pyx_v_i; /* "gensim/models/doc2vec_inner.pyx":458 - * + * * # single randint() call avoids a big thread-sync slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): # <<<<<<<<<<<<<< * reduced_windows[i] = item - * + * */ __pyx_t_2 = 0; __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 458, __pyx_L1_error) @@ -6014,25 +6014,25 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * # single randint() call avoids a big thread-sync slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): * reduced_windows[i] = item # <<<<<<<<<<<<<< - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) */ __pyx_t_12 = __Pyx_PyInt_As_npy_uint32(__pyx_v_item); if (unlikely((__pyx_t_12 == ((npy_uint32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 459, __pyx_L1_error) (__pyx_v_reduced_windows[__pyx_v_i]) = __pyx_t_12; /* "gensim/models/doc2vec_inner.pyx":458 - * + * * # single randint() call avoids a big thread-sync slowdown * for i, item in enumerate(model.random.randint(0, window, document_len)): # <<<<<<<<<<<<<< * reduced_windows[i] = item - * + * */ } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "gensim/models/doc2vec_inner.pyx":461 * reduced_windows[i] = item - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) # <<<<<<<<<<<<<< * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] @@ -6047,7 +6047,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT __pyx_v_doctag_len = ((int)__pyx_t_13); /* "gensim/models/doc2vec_inner.pyx":462 - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) * for i in range(doctag_len): # <<<<<<<<<<<<<< * _doctag_indexes[i] = doctag_indexes[i] @@ -6062,7 +6062,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] # <<<<<<<<<<<<<< * result += 1 - * + * */ __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_doctag_indexes, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 463, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -6074,14 +6074,14 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] * result += 1 # <<<<<<<<<<<<<< - * + * * # release GIL & train on the document */ __pyx_v_result = (__pyx_v_result + 1); } /* "gensim/models/doc2vec_inner.pyx":467 - * + * * # release GIL & train on the document * with nogil: # <<<<<<<<<<<<<< * for i in range(document_len): @@ -6156,7 +6156,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * k = i + window + 1 - reduced_windows[i] * if k > document_len: # <<<<<<<<<<<<<< * k = document_len - * + * */ __pyx_t_6 = ((__pyx_v_k > __pyx_v_document_len) != 0); if (__pyx_t_6) { @@ -6165,7 +6165,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * k = i + window + 1 - reduced_windows[i] * if k > document_len: * k = document_len # <<<<<<<<<<<<<< - * + * * # compose l1 (in _neu1) & clear _work */ __pyx_v_k = __pyx_v_document_len; @@ -6175,12 +6175,12 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * k = i + window + 1 - reduced_windows[i] * if k > document_len: # <<<<<<<<<<<<<< * k = document_len - * + * */ } /* "gensim/models/doc2vec_inner.pyx":477 - * + * * # compose l1 (in _neu1) & clear _work * memset(_neu1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< * count = 0.0 @@ -6411,7 +6411,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT /* "gensim/models/doc2vec_inner.pyx":502 * size, _learn_hidden) - * + * * if not cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, _work, &ONE) # (does this need BLAS-variants like saxpy?) * # apply accumulated error in work @@ -6420,7 +6420,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT if (__pyx_t_6) { /* "gensim/models/doc2vec_inner.pyx":503 - * + * * if not cbow_mean: * sscal(&size, &inv_count, _work, &ONE) # (does this need BLAS-variants like saxpy?) # <<<<<<<<<<<<<< * # apply accumulated error in work @@ -6430,7 +6430,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT /* "gensim/models/doc2vec_inner.pyx":502 * size, _learn_hidden) - * + * * if not cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, _work, &ONE) # (does this need BLAS-variants like saxpy?) * # apply accumulated error in work @@ -6531,7 +6531,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * else: * our_saxpy(&size, &_word_locks[indexes[m]], _work, &ONE, # <<<<<<<<<<<<<< * &_word_vectors[indexes[m] * size], &ONE) - * + * */ /*else*/ { @@ -6539,7 +6539,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT * else: * our_saxpy(&size, &_word_locks[indexes[m]], _work, &ONE, * &_word_vectors[indexes[m] * size], &ONE) # <<<<<<<<<<<<<< - * + * * return result */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v__word_locks[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v__work, (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE), (&(__pyx_v__word_vectors[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE)); @@ -6559,7 +6559,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT } /* "gensim/models/doc2vec_inner.pyx":467 - * + * * # release GIL & train on the document * with nogil: # <<<<<<<<<<<<<< * for i in range(document_len): @@ -6578,10 +6578,10 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT /* "gensim/models/doc2vec_inner.pyx":517 * &_word_vectors[indexes[m] * size], &ONE) - * + * * return result # <<<<<<<<<<<<<< - * - * + * + * */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v_result); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 517, __pyx_L1_error) @@ -6591,8 +6591,8 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT goto __pyx_L0; /* "gensim/models/doc2vec_inner.pyx":363 - * - * + * + * * def train_document_dm(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -6625,8 +6625,8 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_2train_document_dm(CYT } /* "gensim/models/doc2vec_inner.pyx":520 - * - * + * + * * def train_document_dm_concat(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -6659,7 +6659,7 @@ static PyObject *__pyx_pw_6gensim_6models_13doc2vec_inner_5train_document_dm_con values[5] = ((PyObject *)Py_None); /* "gensim/models/doc2vec_inner.pyx":521 - * + * * def train_document_dm_concat(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, * learn_doctags=True, learn_words=True, learn_hidden=True, # <<<<<<<<<<<<<< * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -6813,8 +6813,8 @@ static PyObject *__pyx_pw_6gensim_6models_13doc2vec_inner_5train_document_dm_con __pyx_r = __pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_concat(__pyx_self, __pyx_v_model, __pyx_v_doc_words, __pyx_v_doctag_indexes, __pyx_v_alpha, __pyx_v_work, __pyx_v_neu1, __pyx_v_learn_doctags, __pyx_v_learn_words, __pyx_v_learn_hidden, __pyx_v_word_vectors, __pyx_v_word_locks, __pyx_v_doctag_vectors, __pyx_v_doctag_locks); /* "gensim/models/doc2vec_inner.pyx":520 - * - * + * + * * def train_document_dm_concat(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -6949,7 +6949,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cdef int _learn_doctags = learn_doctags * cdef int _learn_words = learn_words # <<<<<<<<<<<<<< * cdef int _learn_hidden = learn_hidden - * + * */ __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_v_learn_words); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 527, __pyx_L1_error) __pyx_v__learn_words = __pyx_t_2; @@ -6958,7 +6958,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cdef int _learn_doctags = learn_doctags * cdef int _learn_words = learn_words * cdef int _learn_hidden = learn_hidden # <<<<<<<<<<<<<< - * + * * cdef REAL_t *_word_vectors */ __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_v_learn_hidden); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 528, __pyx_L1_error) @@ -6979,7 +6979,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cdef REAL_t _alpha = alpha * cdef int layer1_size = model.layer1_size # <<<<<<<<<<<<<< * cdef int vector_size = model.vector_size - * + * */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 537, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -6991,7 +6991,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cdef REAL_t _alpha = alpha * cdef int layer1_size = model.layer1_size * cdef int vector_size = model.vector_size # <<<<<<<<<<<<<< - * + * * cdef int codelens[MAX_DOCUMENT_LEN] */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_vector_size); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 538, __pyx_L1_error) @@ -7005,7 +7005,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cdef int doctag_len * cdef int window = model.window # <<<<<<<<<<<<<< * cdef int expected_doctag_len = model.dm_tag_count - * + * */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 546, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -7017,7 +7017,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cdef int doctag_len * cdef int window = model.window * cdef int expected_doctag_len = model.dm_tag_count # <<<<<<<<<<<<<< - * + * * cdef int i, j, k, m, n */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_dm_tag_count); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 547, __pyx_L1_error) @@ -7027,11 +7027,11 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con __pyx_v_expected_doctag_len = __pyx_t_2; /* "gensim/models/doc2vec_inner.pyx":550 - * + * * cdef int i, j, k, m, n * cdef long result = 0 # <<<<<<<<<<<<<< * cdef int null_word_index = model.wv.vocab['\0'].index - * + * */ __pyx_v_result = 0; @@ -7039,7 +7039,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cdef int i, j, k, m, n * cdef long result = 0 * cdef int null_word_index = model.wv.vocab['\0'].index # <<<<<<<<<<<<<< - * + * * # For hierarchical softmax */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 551, __pyx_L1_error) @@ -7059,7 +7059,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":564 * cdef unsigned long long next_random - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) # <<<<<<<<<<<<<< * if doctag_len != expected_doctag_len: * return 0 # skip doc without expected number of tags @@ -7074,11 +7074,11 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con __pyx_v_doctag_len = ((int)__pyx_t_7); /* "gensim/models/doc2vec_inner.pyx":565 - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) * if doctag_len != expected_doctag_len: # <<<<<<<<<<<<<< * return 0 # skip doc without expected number of tags - * + * */ __pyx_t_8 = ((__pyx_v_doctag_len != __pyx_v_expected_doctag_len) != 0); if (__pyx_t_8) { @@ -7087,7 +7087,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) * if doctag_len != expected_doctag_len: * return 0 # skip doc without expected number of tags # <<<<<<<<<<<<<< - * + * * # default vectors, locks from syn0/doctag_syn0 */ __Pyx_XDECREF(__pyx_r); @@ -7096,16 +7096,16 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con goto __pyx_L0; /* "gensim/models/doc2vec_inner.pyx":565 - * + * * doctag_len = min(MAX_DOCUMENT_LEN, len(doctag_indexes)) * if doctag_len != expected_doctag_len: # <<<<<<<<<<<<<< * return 0 # skip doc without expected number of tags - * + * */ } /* "gensim/models/doc2vec_inner.pyx":569 - * + * * # default vectors, locks from syn0/doctag_syn0 * if word_vectors is None: # <<<<<<<<<<<<<< * word_vectors = model.wv.syn0 @@ -7131,7 +7131,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con __pyx_t_3 = 0; /* "gensim/models/doc2vec_inner.pyx":569 - * + * * # default vectors, locks from syn0/doctag_syn0 * if word_vectors is None: # <<<<<<<<<<<<<< * word_vectors = model.wv.syn0 @@ -7252,7 +7252,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * if doctag_locks is None: * doctag_locks = model.docvecs.doctag_syn0_lockf # <<<<<<<<<<<<<< * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_docvecs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 579, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); @@ -7275,7 +7275,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * if doctag_locks is None: * doctag_locks = model.docvecs.doctag_syn0_lockf * _doctag_locks = (np.PyArray_DATA(doctag_locks)) # <<<<<<<<<<<<<< - * + * * if hs: */ if (!(likely(((__pyx_v_doctag_locks) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_doctag_locks, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 580, __pyx_L1_error) @@ -7283,19 +7283,19 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":582 * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ __pyx_t_8 = (__pyx_v_hs != 0); if (__pyx_t_8) { /* "gensim/models/doc2vec_inner.pyx":583 - * + * * if hs: * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< - * + * * if negative: */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 583, __pyx_L1_error) @@ -7306,16 +7306,16 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":582 * _doctag_locks = (np.PyArray_DATA(doctag_locks)) - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ } /* "gensim/models/doc2vec_inner.pyx":585 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -7324,7 +7324,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con if (__pyx_t_8) { /* "gensim/models/doc2vec_inner.pyx":586 - * + * * if negative: * syn1neg = (np.PyArray_DATA(model.syn1neg)) # <<<<<<<<<<<<<< * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -7364,7 +7364,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":585 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -7376,7 +7376,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ __pyx_t_9 = (__pyx_v_negative != 0); if (!__pyx_t_9) { @@ -7393,7 +7393,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 590, __pyx_L1_error) @@ -7428,12 +7428,12 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ } /* "gensim/models/doc2vec_inner.pyx":593 - * + * * # convert Python structures to primitive types, so we can release the GIL * if work is None: # <<<<<<<<<<<<<< * work = zeros(model.layer1_size, dtype=REAL) @@ -7474,7 +7474,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con __pyx_t_12 = 0; /* "gensim/models/doc2vec_inner.pyx":593 - * + * * # convert Python structures to primitive types, so we can release the GIL * if work is None: # <<<<<<<<<<<<<< * work = zeros(model.layer1_size, dtype=REAL) @@ -7508,7 +7508,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * if neu1 is None: * neu1 = zeros(model.layer1_size, dtype=REAL) # <<<<<<<<<<<<<< * _neu1 = np.PyArray_DATA(neu1) - * + * */ __pyx_t_12 = __Pyx_GetModuleGlobalName(__pyx_n_s_zeros); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 597, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); @@ -7546,7 +7546,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * if neu1 is None: * neu1 = zeros(model.layer1_size, dtype=REAL) * _neu1 = np.PyArray_DATA(neu1) # <<<<<<<<<<<<<< - * + * * vlookup = model.wv.vocab */ if (!(likely(((__pyx_v_neu1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_neu1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 598, __pyx_L1_error) @@ -7554,7 +7554,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":600 * _neu1 = np.PyArray_DATA(neu1) - * + * * vlookup = model.wv.vocab # <<<<<<<<<<<<<< * i = 0 * for token in doc_words: @@ -7568,7 +7568,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con __pyx_t_3 = 0; /* "gensim/models/doc2vec_inner.pyx":601 - * + * * vlookup = model.wv.vocab * i = 0 # <<<<<<<<<<<<<< * for token in doc_words: @@ -7822,7 +7822,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * if i == MAX_DOCUMENT_LEN: * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< * document_len = i - * + * */ goto __pyx_L16_break; @@ -7851,14 +7851,14 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * if i == MAX_DOCUMENT_LEN: * break # TODO: log warning, tally overflow? * document_len = i # <<<<<<<<<<<<<< - * + * * for i in range(doctag_len): */ __pyx_v_document_len = __pyx_v_i; /* "gensim/models/doc2vec_inner.pyx":619 * document_len = i - * + * * for i in range(doctag_len): # <<<<<<<<<<<<<< * _doctag_indexes[i] = doctag_indexes[i] * result += 1 @@ -7868,11 +7868,11 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con __pyx_v_i = __pyx_t_15; /* "gensim/models/doc2vec_inner.pyx":620 - * + * * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] # <<<<<<<<<<<<<< * result += 1 - * + * */ __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_doctag_indexes, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 620, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -7884,14 +7884,14 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * for i in range(doctag_len): * _doctag_indexes[i] = doctag_indexes[i] * result += 1 # <<<<<<<<<<<<<< - * + * * # release GIL & train on the document */ __pyx_v_result = (__pyx_v_result + 1); } /* "gensim/models/doc2vec_inner.pyx":624 - * + * * # release GIL & train on the document * with nogil: # <<<<<<<<<<<<<< * for i in range(document_len): @@ -7920,7 +7920,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * for i in range(document_len): * j = i - window # negative OK: will pad with null word # <<<<<<<<<<<<<< * k = i + window + 1 # past document end OK: will pad with null word - * + * */ __pyx_v_j = (__pyx_v_i - __pyx_v_window); @@ -7928,13 +7928,13 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * for i in range(document_len): * j = i - window # negative OK: will pad with null word * k = i + window + 1 # past document end OK: will pad with null word # <<<<<<<<<<<<<< - * + * * # compose l1 & clear work */ __pyx_v_k = ((__pyx_v_i + __pyx_v_window) + 1); /* "gensim/models/doc2vec_inner.pyx":630 - * + * * # compose l1 & clear work * for m in range(doctag_len): # <<<<<<<<<<<<<< * # doc vector(s) @@ -8087,14 +8087,14 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * memcpy(&_neu1[(doctag_len + m) * vector_size], &_word_vectors[window_indexes[m] * vector_size], * vector_size * cython.sizeof(REAL_t)) * memset(_work, 0, layer1_size * cython.sizeof(REAL_t)) # work to accumulate l1 error # <<<<<<<<<<<<<< - * + * * if hs: */ memset(__pyx_v__work, 0, (__pyx_v_layer1_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/doc2vec_inner.pyx":649 * memset(_work, 0, layer1_size * cython.sizeof(REAL_t)) # work to accumulate l1 error - * + * * if hs: # <<<<<<<<<<<<<< * fast_document_dmc_hs(points[i], codes[i], codelens[i], * _neu1, syn1, _alpha, _work, @@ -8103,7 +8103,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con if (__pyx_t_9) { /* "gensim/models/doc2vec_inner.pyx":650 - * + * * if hs: * fast_document_dmc_hs(points[i], codes[i], codelens[i], # <<<<<<<<<<<<<< * _neu1, syn1, _alpha, _work, @@ -8113,7 +8113,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":649 * memset(_work, 0, layer1_size * cython.sizeof(REAL_t)) # work to accumulate l1 error - * + * * if hs: # <<<<<<<<<<<<<< * fast_document_dmc_hs(points[i], codes[i], codelens[i], * _neu1, syn1, _alpha, _work, @@ -8150,7 +8150,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":658 * layer1_size, vector_size, _learn_hidden) - * + * * if _learn_doctags: # <<<<<<<<<<<<<< * for m in range(doctag_len): * our_saxpy(&vector_size, &_doctag_locks[_doctag_indexes[m]], &_work[m * vector_size], @@ -8159,7 +8159,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con if (__pyx_t_9) { /* "gensim/models/doc2vec_inner.pyx":659 - * + * * if _learn_doctags: * for m in range(doctag_len): # <<<<<<<<<<<<<< * our_saxpy(&vector_size, &_doctag_locks[_doctag_indexes[m]], &_work[m * vector_size], @@ -8181,7 +8181,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":658 * layer1_size, vector_size, _learn_hidden) - * + * * if _learn_doctags: # <<<<<<<<<<<<<< * for m in range(doctag_len): * our_saxpy(&vector_size, &_doctag_locks[_doctag_indexes[m]], &_work[m * vector_size], @@ -8214,7 +8214,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con * for m in range(2 * window): * our_saxpy(&vector_size, &_word_locks[window_indexes[m]], &_work[(doctag_len + m) * vector_size], # <<<<<<<<<<<<<< * &ONE, &_word_vectors[window_indexes[m] * vector_size], &ONE) - * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_vector_size), (&(__pyx_v__word_locks[(__pyx_v_window_indexes[__pyx_v_m])])), (&(__pyx_v__work[((__pyx_v_doctag_len + __pyx_v_m) * __pyx_v_vector_size)])), (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE), (&(__pyx_v__word_vectors[((__pyx_v_window_indexes[__pyx_v_m]) * __pyx_v_vector_size)])), (&__pyx_v_6gensim_6models_13doc2vec_inner_ONE)); } @@ -8231,7 +8231,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con } /* "gensim/models/doc2vec_inner.pyx":624 - * + * * # release GIL & train on the document * with nogil: # <<<<<<<<<<<<<< * for i in range(document_len): @@ -8250,7 +8250,7 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con /* "gensim/models/doc2vec_inner.pyx":667 * &ONE, &_word_vectors[window_indexes[m] * vector_size], &ONE) - * + * * return result # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); @@ -8261,8 +8261,8 @@ static PyObject *__pyx_pf_6gensim_6models_13doc2vec_inner_4train_document_dm_con goto __pyx_L0; /* "gensim/models/doc2vec_inner.pyx":520 - * - * + * + * * def train_document_dm_concat(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -8340,9 +8340,9 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":203 * # of flags - * + * * if info == NULL: return # <<<<<<<<<<<<<< - * + * * cdef int copy_shape, i, ndim */ __pyx_t_1 = ((__pyx_v_info == NULL) != 0); @@ -8352,11 +8352,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":206 - * + * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) - * + * */ __pyx_v_endian_detector = 1; @@ -8364,23 +8364,23 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< - * + * * ndim = PyArray_NDIM(self) */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":209 * cdef bint little_endian = ((&endian_detector)[0] != 0) - * + * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: @@ -8389,7 +8389,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P if (__pyx_t_1) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":212 - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< * else: @@ -8399,7 +8399,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: @@ -8411,7 +8411,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) */ /*else*/ { @@ -8421,7 +8421,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") @@ -8434,11 +8434,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":217 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not C contiguous") - * + * */ __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); __pyx_t_1 = __pyx_t_2; @@ -8446,7 +8446,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") @@ -8457,7 +8457,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 218, __pyx_L1_error) @@ -8468,7 +8468,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") @@ -8477,7 +8477,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") @@ -8490,11 +8490,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":221 - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not Fortran contiguous") - * + * */ __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); __pyx_t_1 = __pyx_t_2; @@ -8502,7 +8502,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") @@ -8513,7 +8513,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< - * + * * info.buf = PyArray_DATA(self) */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 222, __pyx_L1_error) @@ -8524,7 +8524,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") @@ -8533,7 +8533,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":224 * raise ValueError(u"ndarray is not Fortran contiguous") - * + * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< * info.ndim = ndim * if copy_shape: @@ -8541,7 +8541,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":225 - * + * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< * if copy_shape: @@ -8652,7 +8652,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< * info.readonly = not PyArray_ISWRITEABLE(self) - * + * */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); @@ -8660,13 +8660,13 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< - * + * * cdef int t */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":242 - * + * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< * cdef dtype descr = self.descr @@ -8679,7 +8679,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< * cdef int offset - * + * */ __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); __Pyx_INCREF(__pyx_t_3); @@ -8688,16 +8688,16 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":246 * cdef int offset - * + * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< - * + * * if not hasfields and not copy_shape: */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) - * + * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None @@ -8728,7 +8728,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) - * + * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None @@ -8740,7 +8740,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< - * + * * if not hasfields: */ /*else*/ { @@ -8754,7 +8754,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self - * + * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or @@ -8763,7 +8763,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P if (__pyx_t_1) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":256 - * + * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< * if ((descr.byteorder == c'>' and little_endian) or @@ -9076,7 +9076,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self - * + * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or @@ -9125,7 +9125,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): */ (__pyx_v_f[0]) = '\x00'; @@ -9165,7 +9165,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) @@ -9188,7 +9188,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannySetupContext("__releasebuffer__", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) @@ -9207,7 +9207,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s free(__pyx_v_info->format); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) @@ -9230,7 +9230,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< * # info.shape was stored after info.strides in the same block - * + * */ free(__pyx_v_info->strides); @@ -9245,7 +9245,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) @@ -9257,10 +9257,10 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t - * + * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { @@ -9270,10 +9270,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":771 - * + * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); @@ -9285,10 +9285,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t - * + * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) - * + * */ /* function exit code */ @@ -9304,10 +9304,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) - * + * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { @@ -9317,10 +9317,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":774 - * + * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); @@ -9332,10 +9332,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) - * + * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) - * + * */ /* function exit code */ @@ -9351,10 +9351,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { @@ -9364,10 +9364,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":777 - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); @@ -9379,10 +9379,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) - * + * */ /* function exit code */ @@ -9398,10 +9398,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { @@ -9411,10 +9411,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":780 - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); @@ -9426,10 +9426,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) - * + * */ /* function exit code */ @@ -9445,10 +9445,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { @@ -9458,10 +9458,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":783 - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< - * + * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); @@ -9473,10 +9473,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * */ /* function exit code */ @@ -9492,7 +9492,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. @@ -9520,7 +9520,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_RefNannySetupContext("_util_dtypestring", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":790 - * + * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) @@ -9533,13 +9533,13 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * cdef tuple fields - * + * */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields - * + * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields @@ -9561,11 +9561,11 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_3 = 0; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":795 - * + * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< * child, new_offset = fields - * + * */ if (unlikely(__pyx_v_descr->fields == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); @@ -9581,7 +9581,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< - * + * * if (end - f) - (new_offset - offset[0]) < 15: */ if (likely(__pyx_v_fields != Py_None)) { @@ -9597,8 +9597,8 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __PYX_ERR(1, 796, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else @@ -9618,10 +9618,10 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields - * + * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * */ __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 798, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); @@ -9634,10 +9634,10 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx if (__pyx_t_6) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 - * + * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * + * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 799, __pyx_L1_error) @@ -9648,16 +9648,16 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields - * + * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * */ } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") @@ -9676,7 +9676,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_L8_next_or:; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":802 - * + * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") @@ -9694,7 +9694,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") @@ -9716,7 +9716,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") @@ -9724,7 +9724,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":813 - * + * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< * f[0] = 120 # "x"; pad byte @@ -9753,7 +9753,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< * offset[0] += 1 - * + * */ __pyx_v_f = (__pyx_v_f + 1); @@ -9761,7 +9761,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< - * + * * offset[0] += child.itemsize */ __pyx_t_8 = 0; @@ -9770,9 +9770,9 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":818 * offset[0] += 1 - * + * * offset[0] += child.itemsize # <<<<<<<<<<<<<< - * + * * if not PyDataType_HASFIELDS(child): */ __pyx_t_8 = 0; @@ -9780,7 +9780,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize - * + * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: @@ -9789,7 +9789,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx if (__pyx_t_6) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":821 - * + * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: @@ -9805,7 +9805,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") - * + * */ __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (__pyx_t_6) { @@ -9814,7 +9814,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * + * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 823, __pyx_L1_error) @@ -9828,12 +9828,12 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") - * + * */ } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":826 - * + * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" @@ -10179,7 +10179,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize - * + * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: @@ -10192,7 +10192,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< * return f - * + * */ /*else*/ { __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) __PYX_ERR(1, 849, __pyx_L1_error) @@ -10202,7 +10202,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields - * + * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields @@ -10214,15 +10214,15 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_r = __pyx_v_f; goto __pyx_L0; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. @@ -10246,8 +10246,8 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 - * - * + * + * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: @@ -10316,7 +10316,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< * arr.base = baseptr - * + * */ Py_XDECREF(__pyx_v_arr->base); @@ -10324,14 +10324,14 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< - * + * * cdef inline object get_array_base(ndarray arr): */ __pyx_v_arr->base = __pyx_v_baseptr; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 - * - * + * + * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: @@ -10343,7 +10343,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr - * + * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None @@ -10356,7 +10356,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __Pyx_RefNannySetupContext("get_array_base", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 - * + * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None @@ -10378,7 +10378,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 - * + * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None @@ -10390,8 +10390,8 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py * return None * else: * return arr.base # <<<<<<<<<<<<<< - * - * + * + * */ /*else*/ { __Pyx_XDECREF(__pyx_r); @@ -10402,7 +10402,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr - * + * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None @@ -10481,7 +10481,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { * _import_array() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.multiarray failed to import") - * + * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { @@ -10495,7 +10495,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_umath() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 989, __pyx_L5_except_error) @@ -10548,7 +10548,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":991 * raise ImportError("numpy.core.multiarray failed to import") - * + * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10568,7 +10568,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_RefNannySetupContext("import_umath", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 - * + * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10593,7 +10593,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 993, __pyx_L3_error) /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 - * + * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10612,7 +10612,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") - * + * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { @@ -10626,7 +10626,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_ufunc() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 995, __pyx_L5_except_error) @@ -10639,7 +10639,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L5_except_error:; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 - * + * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10656,7 +10656,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":991 * raise ImportError("numpy.core.multiarray failed to import") - * + * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10679,7 +10679,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") - * + * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10699,7 +10699,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_RefNannySetupContext("import_ufunc", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 - * + * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10724,7 +10724,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 999, __pyx_L3_error) /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 - * + * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10767,7 +10767,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L5_except_error:; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 - * + * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10784,7 +10784,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") - * + * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10866,7 +10866,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_fblas, __pyx_k_fblas, sizeof(__pyx_k_fblas), 0, 0, 1, 1}, {&__pyx_n_s_float32, __pyx_k_float32, sizeof(__pyx_k_float32), 0, 0, 1, 1}, {&__pyx_n_s_gensim_models_doc2vec_inner, __pyx_k_gensim_models_doc2vec_inner, sizeof(__pyx_k_gensim_models_doc2vec_inner), 0, 0, 1, 1}, - {&__pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_k_home_ivan_release_gensim_gensim, sizeof(__pyx_k_home_ivan_release_gensim_gensim), 0, 0, 1, 0}, + {&__pyx_kp_s_gensim_models_doc2vec_inner_pyx, __pyx_k_gensim_models_doc2vec_inner_pyx, sizeof(__pyx_k_gensim_models_doc2vec_inner_pyx), 0, 0, 1, 0}, {&__pyx_n_s_hs, __pyx_k_hs, sizeof(__pyx_k_hs), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, @@ -10958,7 +10958,7 @@ static int __Pyx_InitCachedConstants(void) { * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_tuple_ = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 291, __pyx_L1_error) @@ -10972,7 +10972,7 @@ static int __Pyx_InitCachedConstants(void) { * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_tuple__3 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 428, __pyx_L1_error) @@ -10986,7 +10986,7 @@ static int __Pyx_InitCachedConstants(void) { * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_tuple__6 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 590, __pyx_L1_error) @@ -11000,7 +11000,7 @@ static int __Pyx_InitCachedConstants(void) { * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 218, __pyx_L1_error) @@ -11011,7 +11011,7 @@ static int __Pyx_InitCachedConstants(void) { * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< - * + * * info.buf = PyArray_DATA(self) */ __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 222, __pyx_L1_error) @@ -11030,10 +11030,10 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GIVEREF(__pyx_tuple__10); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 - * + * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * + * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 799, __pyx_L1_error) @@ -11055,7 +11055,7 @@ static int __Pyx_InitCachedConstants(void) { * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * + * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(1, 823, __pyx_L1_error) @@ -11066,7 +11066,7 @@ static int __Pyx_InitCachedConstants(void) { * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_umath() except -1: */ __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 989, __pyx_L1_error) @@ -11077,7 +11077,7 @@ static int __Pyx_InitCachedConstants(void) { * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_ufunc() except -1: */ __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(1, 995, __pyx_L1_error) @@ -11094,8 +11094,8 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GIVEREF(__pyx_tuple__16); /* "gensim/models/doc2vec_inner.pyx":227 - * - * + * + * * def train_document_dbow(model, doc_words, doctag_indexes, alpha, work=None, # <<<<<<<<<<<<<< * train_words=False, learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -11103,11 +11103,11 @@ static int __Pyx_InitCachedConstants(void) { __pyx_tuple__18 = PyTuple_Pack(50, __pyx_n_s_model, __pyx_n_s_doc_words, __pyx_n_s_doctag_indexes, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_train_words, __pyx_n_s_learn_doctags, __pyx_n_s_learn_words, __pyx_n_s_learn_hidden, __pyx_n_s_word_vectors, __pyx_n_s_word_locks, __pyx_n_s_doctag_vectors, __pyx_n_s_doctag_locks, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_train_words_2, __pyx_n_s_learn_words_2, __pyx_n_s_learn_hidden_2, __pyx_n_s_learn_doctags_2, __pyx_n_s_word_vectors_2, __pyx_n_s_doctag_vectors_2, __pyx_n_s_word_locks_2, __pyx_n_s_doctag_locks_2, __pyx_n_s_work_2, __pyx_n_s_alpha_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_doctag_indexes_2, __pyx_n_s_reduced_windows, __pyx_n_s_document_len, __pyx_n_s_doctag_len, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_r, __pyx_n_s_result, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_syn1neg, __pyx_n_s_cum_table, __pyx_n_s_cum_table_len, __pyx_n_s_next_random, __pyx_n_s_vlookup, __pyx_n_s_token, __pyx_n_s_predict_word, __pyx_n_s_item, __pyx_n_s_k); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 227, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__18); __Pyx_GIVEREF(__pyx_tuple__18); - __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(13, 0, 50, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_train_document_dbow, 227, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) __PYX_ERR(0, 227, __pyx_L1_error) + __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(13, 0, 50, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_doc2vec_inner_pyx, __pyx_n_s_train_document_dbow, 227, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) __PYX_ERR(0, 227, __pyx_L1_error) /* "gensim/models/doc2vec_inner.pyx":363 - * - * + * + * * def train_document_dm(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -11115,11 +11115,11 @@ static int __Pyx_InitCachedConstants(void) { __pyx_tuple__20 = PyTuple_Pack(53, __pyx_n_s_model, __pyx_n_s_doc_words, __pyx_n_s_doctag_indexes, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_neu1, __pyx_n_s_learn_doctags, __pyx_n_s_learn_words, __pyx_n_s_learn_hidden, __pyx_n_s_word_vectors, __pyx_n_s_word_locks, __pyx_n_s_doctag_vectors, __pyx_n_s_doctag_locks, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_learn_doctags_2, __pyx_n_s_learn_words_2, __pyx_n_s_learn_hidden_2, __pyx_n_s_cbow_mean, __pyx_n_s_count, __pyx_n_s_inv_count, __pyx_n_s_word_vectors_2, __pyx_n_s_doctag_vectors_2, __pyx_n_s_word_locks_2, __pyx_n_s_doctag_locks_2, __pyx_n_s_work_2, __pyx_n_s_neu1_2, __pyx_n_s_alpha_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_doctag_indexes_2, __pyx_n_s_reduced_windows, __pyx_n_s_document_len, __pyx_n_s_doctag_len, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_m, __pyx_n_s_result, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_syn1neg, __pyx_n_s_cum_table, __pyx_n_s_cum_table_len, __pyx_n_s_next_random, __pyx_n_s_vlookup, __pyx_n_s_token, __pyx_n_s_predict_word, __pyx_n_s_item); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 363, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__20); __Pyx_GIVEREF(__pyx_tuple__20); - __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(13, 0, 53, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_train_document_dm, 363, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) __PYX_ERR(0, 363, __pyx_L1_error) + __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(13, 0, 53, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_doc2vec_inner_pyx, __pyx_n_s_train_document_dm, 363, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) __PYX_ERR(0, 363, __pyx_L1_error) /* "gensim/models/doc2vec_inner.pyx":520 - * - * + * + * * def train_document_dm_concat(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -11127,7 +11127,7 @@ static int __Pyx_InitCachedConstants(void) { __pyx_tuple__22 = PyTuple_Pack(53, __pyx_n_s_model, __pyx_n_s_doc_words, __pyx_n_s_doctag_indexes, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_neu1, __pyx_n_s_learn_doctags, __pyx_n_s_learn_words, __pyx_n_s_learn_hidden, __pyx_n_s_word_vectors, __pyx_n_s_word_locks, __pyx_n_s_doctag_vectors, __pyx_n_s_doctag_locks, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_learn_doctags_2, __pyx_n_s_learn_words_2, __pyx_n_s_learn_hidden_2, __pyx_n_s_word_vectors_2, __pyx_n_s_doctag_vectors_2, __pyx_n_s_word_locks_2, __pyx_n_s_doctag_locks_2, __pyx_n_s_work_2, __pyx_n_s_neu1_2, __pyx_n_s_alpha_2, __pyx_n_s_layer1_size, __pyx_n_s_vector_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_doctag_indexes_2, __pyx_n_s_window_indexes, __pyx_n_s_document_len, __pyx_n_s_doctag_len, __pyx_n_s_window, __pyx_n_s_expected_doctag_len, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_result, __pyx_n_s_null_word_index, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_syn1neg, __pyx_n_s_cum_table, __pyx_n_s_cum_table_len, __pyx_n_s_next_random, __pyx_n_s_vlookup, __pyx_n_s_token, __pyx_n_s_predict_word); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 520, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__22); __Pyx_GIVEREF(__pyx_tuple__22); - __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(13, 0, 53, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_train_document_dm_concat, 520, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 520, __pyx_L1_error) + __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(13, 0, 53, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_doc2vec_inner_pyx, __pyx_n_s_train_document_dm_concat, 520, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 520, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -11239,7 +11239,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) /*--- Function export code ---*/ /*--- Type init code ---*/ /*--- Type import code ---*/ - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", #if CYTHON_COMPILING_IN_PYPY sizeof(PyTypeObject), #else @@ -11278,7 +11278,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) #endif /* "gensim/models/doc2vec_inner.pyx":11 - * + * * import cython * import numpy as np # <<<<<<<<<<<<<< * from numpy import zeros, float32 as REAL @@ -11294,7 +11294,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) * import numpy as np * from numpy import zeros, float32 as REAL # <<<<<<<<<<<<<< * cimport numpy as np - * + * */ __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); @@ -11318,7 +11318,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "gensim/models/doc2vec_inner.pyx":19 - * + * * # scipy <= 0.15 * try: # <<<<<<<<<<<<<< * from scipy.linalg.blas import fblas @@ -11355,7 +11355,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "gensim/models/doc2vec_inner.pyx":19 - * + * * # scipy <= 0.15 * try: # <<<<<<<<<<<<<< * from scipy.linalg.blas import fblas @@ -11390,7 +11390,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) * except ImportError: * # in scipy > 0.15, fblas function has been removed * import scipy.linalg.blas as fblas # <<<<<<<<<<<<<< - * + * * from word2vec_inner cimport bisect_left, random_int32, \ */ __pyx_t_10 = PyList_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 23, __pyx_L4_except_error) @@ -11412,7 +11412,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) __pyx_L4_except_error:; /* "gensim/models/doc2vec_inner.pyx":19 - * + * * # scipy <= 0.15 * try: # <<<<<<<<<<<<<< * from scipy.linalg.blas import fblas @@ -11435,9 +11435,9 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) /* "gensim/models/doc2vec_inner.pyx":31 * our_dot_double, our_dot_float, our_dot_noblas, our_saxpy_noblas - * + * * from word2vec import FAST_VERSION # <<<<<<<<<<<<<< - * + * * DEF MAX_DOCUMENT_LEN = 10000 */ __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 31, __pyx_L1_error) @@ -11456,25 +11456,25 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) /* "gensim/models/doc2vec_inner.pyx":35 * DEF MAX_DOCUMENT_LEN = 10000 - * + * * cdef int ONE = 1 # <<<<<<<<<<<<<< * cdef REAL_t ONEF = 1.0 - * + * */ __pyx_v_6gensim_6models_13doc2vec_inner_ONE = 1; /* "gensim/models/doc2vec_inner.pyx":36 - * + * * cdef int ONE = 1 * cdef REAL_t ONEF = 1.0 # <<<<<<<<<<<<<< - * + * * DEF EXP_TABLE_SIZE = 1000 */ __pyx_v_6gensim_6models_13doc2vec_inner_ONEF = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)1.0); /* "gensim/models/doc2vec_inner.pyx":227 - * - * + * + * * def train_document_dbow(model, doc_words, doctag_indexes, alpha, work=None, # <<<<<<<<<<<<<< * train_words=False, learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -11485,8 +11485,8 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "gensim/models/doc2vec_inner.pyx":363 - * - * + * + * * def train_document_dm(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -11497,8 +11497,8 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "gensim/models/doc2vec_inner.pyx":520 - * - * + * + * * def train_document_dm_concat(model, doc_words, doctag_indexes, alpha, work=None, neu1=None, # <<<<<<<<<<<<<< * learn_doctags=True, learn_words=True, learn_hidden=True, * word_vectors=None, word_locks=None, doctag_vectors=None, doctag_locks=None): @@ -11520,7 +11520,7 @@ PyMODINIT_FUNC PyInit_doc2vec_inner(void) /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") - * + * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() diff --git a/gensim/models/fasttext.py b/gensim/models/fasttext.py index 6174754314..5d1cb27c27 100644 --- a/gensim/models/fasttext.py +++ b/gensim/models/fasttext.py @@ -1,86 +1,279 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +# Authors: Chinmaya Pancholi , Shiva Manne +# Copyright (C) 2017 RaRe Technologies s.r.o. -import logging - -import numpy as np -from numpy import zeros, ones, vstack, sum as np_sum, empty, float32 as REAL - -from gensim.models.word2vec import Word2Vec, train_sg_pair, train_cbow_pair -from gensim.models.wrappers.fasttext import FastTextKeyedVectors -from gensim.models.wrappers.fasttext import FastText as Ft_Wrapper, compute_ngrams, ft_hash - -logger = logging.getLogger(__name__) - -MAX_WORDS_IN_BATCH = 10000 +"""Learn word representations via fasttext's "skip-gram and CBOW models", using either +hierarchical softmax or negative sampling [1]_. +Notes +----- +There are more ways to get word vectors in Gensim than just FastText. +See wrappers for VarEmbed and WordRank or Word2Vec -def train_batch_cbow(model, sentences, alpha, work=None, neu1=None): - result = 0 - for sentence in sentences: - word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab and - model.wv.vocab[w].sample_int > model.random.rand() * 2**32] - for pos, word in enumerate(word_vocabs): - reduced_window = model.random.randint(model.window) - start = max(0, pos - model.window + reduced_window) - window_pos = enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start) - word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] +This module allows training a word embedding from a training corpus with the additional ability +to obtain word vectors for out-of-vocabulary words. - word2_subwords = [] - vocab_subwords_indices = [] - ngrams_subwords_indices = [] +For a tutorial on gensim's native fasttext, refer to the noteboook -- [2]_ - for index in word2_indices: - vocab_subwords_indices += [index] - word2_subwords += model.wv.ngrams_word[model.wv.index2word[index]] +**Make sure you have a C compiler before installing gensim, to use optimized (compiled) fasttext training** - for subword in word2_subwords: - ngrams_subwords_indices.append(model.wv.ngrams[subword]) +References +---------- +.. [1] P. Bojanowski, E. Grave, A. Joulin, T. Mikolov + Enriching Word Vectors with Subword Information. In arXiv preprint arXiv:1607.04606. + https://arxiv.org/abs/1607.04606 - l1_vocab = np_sum(model.wv.syn0_vocab[vocab_subwords_indices], axis=0) # 1 x vector_size - l1_ngrams = np_sum(model.wv.syn0_ngrams[ngrams_subwords_indices], axis=0) # 1 x vector_size +.. [2] https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/FastText_Tutorial.ipynb - l1 = np_sum([l1_vocab, l1_ngrams], axis=0) - subwords_indices = [vocab_subwords_indices] + [ngrams_subwords_indices] - if (subwords_indices[0] or subwords_indices[1]) and model.cbow_mean: - l1 /= (len(subwords_indices[0]) + len(subwords_indices[1])) +""" - # train on the sliding window for target word - train_cbow_pair(model, word, subwords_indices, l1, alpha, is_ft=True) - result += len(word_vocabs) - return result - - -def train_batch_sg(model, sentences, alpha, work=None): - result = 0 - for sentence in sentences: - word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab and - model.wv.vocab[w].sample_int > model.random.rand() * 2**32] - for pos, word in enumerate(word_vocabs): - reduced_window = model.random.randint(model.window) # `b` in the original word2vec code - # now go over all words from the (reduced) window, predicting each one in turn - start = max(0, pos - model.window + reduced_window) +import logging - subwords_indices = [word.index] - word2_subwords = model.wv.ngrams_word[model.wv.index2word[word.index]] +import numpy as np +from numpy import zeros, ones, vstack, sum as np_sum, empty, float32 as REAL - for subword in word2_subwords: - subwords_indices.append(model.wv.ngrams[subword]) +from gensim.models.word2vec import Word2Vec, train_sg_pair, train_cbow_pair +from gensim.models.wrappers.fasttext import FastTextKeyedVectors +from gensim.models.wrappers.fasttext import FastText as Ft_Wrapper, compute_ngrams, ft_hash - for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): - if pos2 != pos: # don't train on the `word` itself - train_sg_pair(model, model.wv.index2word[word2.index], subwords_indices, alpha, is_ft=True) +logger = logging.getLogger(__name__) - result += len(word_vocabs) - return result +try: + from gensim.models.fasttext_inner import train_batch_sg, train_batch_cbow + from gensim.models.fasttext_inner import FAST_VERSION, MAX_WORDS_IN_BATCH + logger.debug('Fast version of Fasttext is being used') + +except ImportError: + # failed... fall back to plain numpy (20-80x slower training than the above) + logger.warning('Slow version of Fasttext is being used') + FAST_VERSION = -1 + MAX_WORDS_IN_BATCH = 10000 + + def train_batch_cbow(model, sentences, alpha, work=None, neu1=None): + """Update CBOW model by training on a sequence of sentences. + + Each sentence is a list of string tokens, which are looked up in the model's + vocab dictionary. Called internally from :meth:`gensim.models.fasttext.FastText.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from fasttext_inner instead. + + Parameters + ---------- + model : :class:`~gensim.models.fasttext.FastText` + `FastText` instance. + sentences : iterable of iterables + Iterable of the sentences directly from disk/network. + alpha : float + Learning rate. + work : :class:`numpy.ndarray` + Private working memory for each worker. + neu1 : :class:`numpy.ndarray` + Private working memory for each worker. + + Returns + ------- + int + Effective number of words trained. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab and + model.wv.vocab[w].sample_int > model.random.rand() * 2**32] + for pos, word in enumerate(word_vocabs): + reduced_window = model.random.randint(model.window) + start = max(0, pos - model.window + reduced_window) + window_pos = enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start) + word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] + + word2_subwords = [] + vocab_subwords_indices = [] + ngrams_subwords_indices = [] + + for index in word2_indices: + vocab_subwords_indices += [index] + word2_subwords += model.wv.ngrams_word[model.wv.index2word[index]] + + for subword in word2_subwords: + ngrams_subwords_indices.append(model.wv.ngrams[subword]) + + l1_vocab = np_sum(model.wv.syn0_vocab[vocab_subwords_indices], axis=0) # 1 x vector_size + l1_ngrams = np_sum(model.wv.syn0_ngrams[ngrams_subwords_indices], axis=0) # 1 x vector_size + + l1 = np_sum([l1_vocab, l1_ngrams], axis=0) + subwords_indices = [vocab_subwords_indices] + [ngrams_subwords_indices] + if (subwords_indices[0] or subwords_indices[1]) and model.cbow_mean: + l1 /= (len(subwords_indices[0]) + len(subwords_indices[1])) + + # train on the sliding window for target word + train_cbow_pair(model, word, subwords_indices, l1, alpha, is_ft=True) + result += len(word_vocabs) + return result + + def train_batch_sg(model, sentences, alpha, work=None, neu1=None): + """Update skip-gram model by training on a sequence of sentences. + + Each sentence is a list of string tokens, which are looked up in the model's + vocab dictionary. Called internally from :meth:`gensim.models.fasttext.FastText.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from fasttext_inner instead. + + Parameters + ---------- + model : :class:`~gensim.models.fasttext.FastText` + `FastText` instance. + sentences : iterable of iterables + Iterable of the sentences directly from disk/network. + alpha : float + Learning rate. + work : :class:`numpy.ndarray` + Private working memory for each worker. + neu1 : :class:`numpy.ndarray` + Private working memory for each worker. + + Returns + ------- + int + Effective number of words trained. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab and + model.wv.vocab[w].sample_int > model.random.rand() * 2**32] + for pos, word in enumerate(word_vocabs): + reduced_window = model.random.randint(model.window) # `b` in the original word2vec code + # now go over all words from the (reduced) window, predicting each one in turn + start = max(0, pos - model.window + reduced_window) + + subwords_indices = [word.index] + word2_subwords = model.wv.ngrams_word[model.wv.index2word[word.index]] + + for subword in word2_subwords: + subwords_indices.append(model.wv.ngrams[subword]) + + for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): + if pos2 != pos: # don't train on the `word` itself + train_sg_pair(model, model.wv.index2word[word2.index], subwords_indices, alpha, is_ft=True) + + result += len(word_vocabs) + return result class FastText(Word2Vec): - def __init__(self, sentences=None, sg=0, hs=0, size=100, alpha=0.025, window=5, min_count=5, - max_vocab_size=None, word_ngrams=1, loss='ns', sample=1e-3, seed=1, workers=3, min_alpha=0.0001, - negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, min_n=3, max_n=6, - sorted_vocab=1, bucket=2000000, trim_rule=None, batch_words=MAX_WORDS_IN_BATCH): - + """Class for training, using and evaluating word representations learned + using method described in [1] aka Fasttext. + + The model can be stored/loaded via its :meth:`~gensim.models.fasttext.FastText.save()` and + :meth:`~gensim.models.fasttext.FastText.load()` methods, or loaded in a format compatible with the original + fasttext implementation via :meth:`~gensim.models.fasttext.FastText.load_fasttext_format()`. + + References + ---------- + .. [1] P. Bojanowski, E. Grave, A. Joulin, T. Mikolov + Enriching Word Vectors with Subword Information. In arXiv preprint arXiv:1607.04606. + https://arxiv.org/abs/1607.04606 + + """ + def __init__( + self, sentences=None, sg=0, hs=0, size=100, alpha=0.025, window=5, min_count=5, + max_vocab_size=None, word_ngrams=1, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, + negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, min_n=3, max_n=6, sorted_vocab=1, + bucket=2000000, trim_rule=None, batch_words=MAX_WORDS_IN_BATCH): + """Initialize the model from an iterable of `sentences`. Each sentence is a + list of words (unicode strings) that will be used for training. + + Parameters + ---------- + sentences : iterable of iterables + The `sentences` iterable can be simply a list of lists of tokens, but for larger corpora, + consider an iterable that streams the sentences directly from disk/network. + See :class:`~gensim.models.word2vec.BrownCorpus`, :class:`~gensim.models.word2vec.Text8Corpus` + or :class:`~gensim.models.word2vec.LineSentence` in :mod:`~gensim.models.word2vec` module for such examples. + If you don't supply `sentences`, the model is left uninitialized -- use if you plan to initialize it + in some other way. + sg : int {1, 0} + Defines the training algorithm. If 1, skip-gram is used, otherwise, CBOW is employed. + size : int + Dimensionality of the feature vectors. + window : int + The maximum distance between the current and predicted word within a sentence. + alpha : float + The initial learning rate. + min_alpha : float + Learning rate will linearly drop to `min_alpha` as training progresses. + seed : int + Seed for the random number generator. Initial vectors for each word are seeded with a hash of + the concatenation of word + `str(seed)`. Note that for a fully deterministically-reproducible run, + you must also limit the model to a single worker thread (`workers=1`), to eliminate ordering jitter + from OS thread scheduling. (In Python 3, reproducibility between interpreter launches also requires + use of the `PYTHONHASHSEED` environment variable to control hash randomization). + min_count : int + Ignores all words with total frequency lower than this. + max_vocab_size : int + Limits the RAM during vocabulary building; if there are more unique + words than this, then prune the infrequent ones. Every 10 million word types need about 1GB of RAM. + Set to `None` for no limit. + sample : float + The threshold for configuring which higher-frequency words are randomly downsampled, + useful range is (0, 1e-5). + workers : int + Use these many worker threads to train the model (=faster training with multicore machines). + hs : int {1,0} + If 1, hierarchical softmax will be used for model training. + If set to 0, and `negative` is non-zero, negative sampling will be used. + negative : int + If > 0, negative sampling will be used, the int for negative specifies how many "noise words" + should be drawn (usually between 5-20). + If set to 0, no negative sampling is used. + cbow_mean : int {1,0} + If 0, use the sum of the context word vectors. If 1, use the mean, only applies when cbow is used. + hashfxn : function + Hash function to use to randomly initialize weights, for increased training reproducibility. + iter : int + Number of iterations (epochs) over the corpus. + trim_rule : function + Vocabulary trimming rule, specifies whether certain words should remain in the vocabulary, + be trimmed away, or handled using the default (discard if word count < min_count). + Can be None (min_count will be used, look to :func:`~gensim.utils.keep_vocab_item`), + or a callable that accepts parameters (word, count, min_count) and returns either + :attr:`gensim.utils.RULE_DISCARD`, :attr:`gensim.utils.RULE_KEEP` or :attr:`gensim.utils.RULE_DEFAULT`. + Note: The rule, if given, is only used to prune vocabulary during build_vocab() and is not stored as part + of the model. + sorted_vocab : int {1,0} + If 1, sort the vocabulary by descending frequency before assigning word indexes. + batch_words : int + Target size (in words) for batches of examples passed to worker threads (and + thus cython routines).(Larger batches will be passed if individual + texts are longer than 10000 words, but the standard cython code truncates to that maximum.) + min_n : int + Min length of char ngrams to be used for training word representations. + max_n : int + Max length of char ngrams to be used for training word representations. Set `max_n` to be + lesser than `min_n` to avoid char ngrams being used. + word_ngrams : int {1,0} + If 1, uses enriches word vectors with subword(ngrams) information. + If 0, this is equivalent to word2vec. + bucket : int + Character ngrams are hashed into a fixed number of buckets, in order to limit the + memory usage of the model. This option specifies the number of buckets used by the model. + + Examples + -------- + Initialize and train a `FastText` model + + >>> from gensim.models import FastText + >>> sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]] + >>> + >>> model = FastText(sentences, min_count=1) + >>> say_vector = model['say'] # get vector for word + >>> of_vector = model['of'] # get vector for out-of-vocab word + + + """ # fastText specific params self.bucket = bucket self.word_ngrams = word_ngrams @@ -93,30 +286,79 @@ def __init__(self, sentences=None, sg=0, hs=0, size=100, alpha=0.025, window=5, sentences=sentences, size=size, alpha=alpha, window=window, min_count=min_count, max_vocab_size=max_vocab_size, sample=sample, seed=seed, workers=workers, min_alpha=min_alpha, sg=sg, hs=hs, negative=negative, cbow_mean=cbow_mean, hashfxn=hashfxn, iter=iter, null_word=null_word, - trim_rule=trim_rule, sorted_vocab=sorted_vocab, batch_words=batch_words - ) + trim_rule=trim_rule, sorted_vocab=sorted_vocab, batch_words=batch_words) def initialize_word_vectors(self): + """Initializes FastTextKeyedVectors instance to store all vocab/ngram vectors for the model.""" self.wv = FastTextKeyedVectors() self.wv.min_n = self.min_n self.wv.max_n = self.max_n def build_vocab(self, sentences, keep_raw_vocab=False, trim_rule=None, progress_per=10000, update=False): + """Build vocabulary from a sequence of sentences (can be a once-only generator stream). + Each sentence must be a list of unicode strings. + + Parameters + ---------- + sentences : iterable of iterables + The `sentences` iterable can be simply a list of lists of tokens, but for larger corpora, + consider an iterable that streams the sentences directly from disk/network. + See :class:`~gensim.models.word2vec.BrownCorpus`, :class:`~gensim.models.word2vec.Text8Corpus` + or :class:`~gensim.models.word2vec.LineSentence` in :mod:`~gensim.models.word2vec` module for such examples. + keep_raw_vocab : bool + If not true, delete the raw vocabulary after the scaling is done and free up RAM. + trim_rule : function + Vocabulary trimming rule, specifies whether certain words should remain in the vocabulary, + be trimmed away, or handled using the default (discard if word count < min_count). + Can be None (min_count will be used, look to :func:`~gensim.utils.keep_vocab_item`), + or a callable that accepts parameters (word, count, min_count) and returns either + :attr:`gensim.utils.RULE_DISCARD`, :attr:`gensim.utils.RULE_KEEP` or :attr:`gensim.utils.RULE_DEFAULT`. + Note: The rule, if given, is only used to prune vocabulary during build_vocab() and is not stored as part + of the model. + progress_per : int + Indicates how many words to process before showing/updating the progress. + update: bool + If true, the new words in `sentences` will be added to model's vocab. + + Example + ------- + Train a model and update vocab for online training + + >>> from gensim.models import FastText + >>> sentences_1 = [["cat", "say", "meow"], ["dog", "say", "woof"]] + >>> sentences_2 = [["dude", "say", "wazzup!"]] + >>> + >>> model = FastText(min_count=1) + >>> model.build_vocab(sentences_1) + >>> model.train(sentences_1, total_examples=model.corpus_count, epochs=model.iter) + >>> model.build_vocab(sentences_2, update=True) + >>> model.train(sentences_2, total_examples=model.corpus_count, epochs=model.iter) + + """ if update: if not len(self.wv.vocab): raise RuntimeError( "You cannot do an online vocabulary-update of a model which has no prior vocabulary. " - "First build the vocabulary of your model with a corpus before doing an online update." - ) + "First build the vocabulary of your model with a corpus " + "before doing an online update.") self.old_vocab_len = len(self.wv.vocab) self.old_hash2index_len = len(self.wv.hash2index) super(FastText, self).build_vocab( - sentences, keep_raw_vocab=keep_raw_vocab, trim_rule=trim_rule, progress_per=progress_per, update=update - ) + sentences, keep_raw_vocab=keep_raw_vocab, trim_rule=trim_rule, progress_per=progress_per, update=update) self.init_ngrams(update=update) def init_ngrams(self, update=False): + """Compute ngrams of all words present in vocabulary and stores vectors for only those ngrams. + Vectors for other ngrams are initialized with a random uniform distribution in FastText. + + Parameters + ---------- + update : bool + If True, the new vocab words and their new ngrams word vectors are initialized + with random uniform distribution and updated/added to the existing vocab word and ngram vectors. + + """ if not update: self.wv.ngrams = {} self.wv.syn0_vocab = empty((len(self.wv.vocab), self.vector_size), dtype=REAL) @@ -138,7 +380,7 @@ def init_ngrams(self, update=False): ngram_indices = [] new_hash_count = 0 for i, ngram in enumerate(all_ngrams): - ngram_hash = ft_hash(ngram) + ngram_hash = ft_hash(ngram) % self.bucket if ngram_hash in self.wv.hash2index: self.wv.ngrams[ngram] = self.wv.hash2index[ngram_hash] else: @@ -160,7 +402,7 @@ def init_ngrams(self, update=False): logger.info("Number of new ngrams is %d", len(new_ngrams)) new_hash_count = 0 for i, ngram in enumerate(new_ngrams): - ngram_hash = ft_hash(ngram) + ngram_hash = ft_hash(ngram) % self.bucket if ngram_hash not in self.wv.hash2index: self.wv.hash2index[ngram_hash] = new_hash_count + self.old_hash2index_len self.wv.ngrams[ngram] = self.wv.hash2index[ngram_hash] @@ -173,15 +415,16 @@ def init_ngrams(self, update=False): new_vocab_rows = rand_obj.uniform( -1.0 / self.vector_size, 1.0 / self.vector_size, (len(self.wv.vocab) - self.old_vocab_len, self.vector_size) - ) + ).astype(REAL) new_vocab_lockf_rows = ones((len(self.wv.vocab) - self.old_vocab_len, self.vector_size), dtype=REAL) new_ngram_rows = rand_obj.uniform( -1.0 / self.vector_size, 1.0 / self.vector_size, (len(self.wv.hash2index) - self.old_hash2index_len, self.vector_size) - ) + ).astype(REAL) new_ngram_lockf_rows = ones( - (len(self.wv.hash2index) - self.old_hash2index_len, self.vector_size), dtype=REAL - ) + (len(self.wv.hash2index) - self.old_hash2index_len, + self.vector_size), + dtype=REAL) self.wv.syn0_vocab = vstack([self.wv.syn0_vocab, new_vocab_rows]) self.syn0_vocab_lockf = vstack([self.syn0_vocab_lockf, new_vocab_lockf_rows]) @@ -189,22 +432,47 @@ def init_ngrams(self, update=False): self.syn0_ngrams_lockf = vstack([self.syn0_ngrams_lockf, new_ngram_lockf_rows]) def reset_ngram_weights(self): + """Reset all projection weights to an initial (untrained) state, + but keep the existing vocabulary and their ngrams. + + """ rand_obj = np.random rand_obj.seed(self.seed) for index in range(len(self.wv.vocab)): self.wv.syn0_vocab[index] = rand_obj.uniform( -1.0 / self.vector_size, 1.0 / self.vector_size, self.vector_size - ) + ).astype(REAL) for index in range(len(self.wv.hash2index)): self.wv.syn0_ngrams[index] = rand_obj.uniform( -1.0 / self.vector_size, 1.0 / self.vector_size, self.vector_size - ) + ).astype(REAL) def _do_train_job(self, sentences, alpha, inits): + """Train a single batch of sentences. Return 2-tuple `(effective word count after + ignoring unknown words and sentence length trimming, total word count)`. + + Parameters + ---------- + sentences : iterable of iterables + The `sentences` iterable can be simply a list of lists of tokens, but for larger corpora, + consider an iterable that streams the sentences directly from disk/network. + See :class:`~gensim.models.word2vec.BrownCorpus`, :class:`~gensim.models.word2vec.Text8Corpus` + or :class:`~gensim.models.word2vec.LineSentence` in :mod:`~gensim.models.word2vec` module for such examples. + alpha : float + The current learning rate. + inits : (:class:`numpy.ndarray`, :class:`numpy.ndarray`) + Each worker's private work memory. + + Returns + ------- + (int, int) + Tuple of (effective word count after ignoring unknown words and sentence length trimming, total word count) + + """ work, neu1 = inits tally = 0 if self.sg: - tally += train_batch_sg(self, sentences, alpha, work) + tally += train_batch_sg(self, sentences, alpha, work, neu1) else: tally += train_batch_cbow(self, sentences, alpha, work, neu1) @@ -213,22 +481,99 @@ def _do_train_job(self, sentences, alpha, inits): def train(self, sentences, total_examples=None, total_words=None, epochs=None, start_alpha=None, end_alpha=None, word_count=0, queue_factor=2, report_delay=1.0): + """Update the model's neural weights from a sequence of sentences (can be a once-only generator stream). + For FastText, each sentence must be a list of unicode strings. (Subclasses may accept other examples.) + + To support linear learning-rate decay from (initial) alpha to min_alpha, and accurate + progress-percentage logging, either total_examples (count of sentences) or total_words (count of + raw words in sentences) **MUST** be provided (if the corpus is the same as was provided to + :meth:`~gensim.models.fasttext.FastText.build_vocab()`, the count of examples in that corpus + will be available in the model's :attr:`corpus_count` property). + + To avoid common mistakes around the model's ability to do multiple training passes itself, an + explicit `epochs` argument **MUST** be provided. In the common and recommended case, + where :meth:`~gensim.models.fasttext.FastText.train()` is only called once, + the model's cached `iter` value should be supplied as `epochs` value. + + Parameters + ---------- + sentences : iterable of iterables + The `sentences` iterable can be simply a list of lists of tokens, but for larger corpora, + consider an iterable that streams the sentences directly from disk/network. + See :class:`~gensim.models.word2vec.BrownCorpus`, :class:`~gensim.models.word2vec.Text8Corpus` + or :class:`~gensim.models.word2vec.LineSentence` in :mod:`~gensim.models.word2vec` module for such examples. + total_examples : int + Count of sentences. + total_words : int + Count of raw words in sentences. + epochs : int + Number of iterations (epochs) over the corpus. + start_alpha : float + Initial learning rate. + end_alpha : float + Final learning rate. Drops linearly from `start_alpha`. + word_count : int + Count of words already trained. Set this to 0 for the usual + case of training on all words in sentences. + queue_factor : int + Multiplier for size of queue (number of workers * queue_factor). + report_delay : float + Seconds to wait before reporting progress. + + Examples + -------- + >>> from gensim.models import FastText + >>> sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]] + >>> + >>> model = FastText(min_count=1) + >>> model.build_vocab(sentences) + >>> model.train(sentences, total_examples=model.corpus_count, epochs=model.iter) + + """ self.neg_labels = [] if self.negative > 0: # precompute negative labels optimization for pure-python training self.neg_labels = zeros(self.negative + 1) self.neg_labels[0] = 1. - Word2Vec.train(self, sentences, total_examples=self.corpus_count, epochs=self.iter, + Word2Vec.train( + self, sentences, total_examples=self.corpus_count, epochs=self.iter, start_alpha=self.alpha, end_alpha=self.min_alpha) self.get_vocab_word_vecs() def __getitem__(self, word): + """Get `word` representations in vector space, as a 1D numpy array. + + Parameters + ---------- + word : str + A single word whose vector needs to be returned. + + Returns + ------- + :class:`numpy.ndarray` + The word's representations in vector space, as a 1D numpy array. + + Raises + ------ + KeyError + For words with all ngrams absent, a KeyError is raised. + + Example + ------- + >>> from gensim.models import FastText + >>> from gensim.test.utils import datapath + >>> + >>> trained_model = FastText.load_fasttext_format(datapath('lee_fasttext')) + >>> meow_vector = trained_model['hello'] # get vector for word + + """ return self.word_vec(word) def get_vocab_word_vecs(self): + """Calculate vectors for words in vocabulary and stores them in `wv.syn0`.""" for w, v in self.wv.vocab.items(): - word_vec = self.wv.syn0_vocab[v.index] + word_vec = np.copy(self.wv.syn0_vocab[v.index]) ngrams = self.wv.ngrams_word[w] ngram_weights = self.wv.syn0_ngrams for ngram in ngrams: @@ -237,12 +582,58 @@ def get_vocab_word_vecs(self): self.wv.syn0[v.index] = word_vec def word_vec(self, word, use_norm=False): + """Get the word's representations in vector space, as a 1D numpy array. + + Parameters + ---------- + word : str + A single word whose vector needs to be returned. + use_norm : bool + If True, returns normalized vector. + + Returns + ------- + :class:`numpy.ndarray` + The word's representations in vector space, as a 1D numpy array. + + Raises + ------ + KeyError + For words with all ngrams absent, a KeyError is raised. + + Example + ------- + >>> from gensim.models import FastText + >>> sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]] + >>> + >>> model = FastText(sentences, min_count=1) + >>> meow_vector = model.word_vec('meow') # get vector for word + + """ return FastTextKeyedVectors.word_vec(self.wv, word, use_norm=use_norm) @classmethod def load_fasttext_format(cls, *args, **kwargs): + """Load a :class:`~gensim.models.fasttext.FastText` model from a format compatible with + the original fasttext implementation. + + Parameters + ---------- + fname : str + Path to the file. + + """ return Ft_Wrapper.load_fasttext_format(*args, **kwargs) def save(self, *args, **kwargs): + """Save the model. This saved model can be loaded again using :func:`~gensim.models.fasttext.FastText.load`, + which supports online training and getting vectors for out-of-vocabulary words. + + Parameters + ---------- + fname : str + Path to the file. + + """ kwargs['ignore'] = kwargs.get('ignore', ['syn0norm', 'syn0_vocab_norm', 'syn0_ngrams_norm']) super(FastText, self).save(*args, **kwargs) diff --git a/gensim/models/fasttext_inner.c b/gensim/models/fasttext_inner.c new file mode 100644 index 0000000000..f7bb4d285a --- /dev/null +++ b/gensim/models/fasttext_inner.c @@ -0,0 +1,12680 @@ +/* Generated by Cython 0.25.2 */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) + #error Cython requires Python 2.6+ or Python 3.2+. +#else +#define CYTHON_ABI "0_25_2" +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x03030000 || (PY_MAJOR_VERSION == 2 && PY_VERSION_HEX >= 0x02070000) + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject **args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + + +#define __PYX_ERR(f_index, lineno, Ln_error) \ +{ \ + __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +} + +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__gensim__models__fasttext_inner +#define __PYX_HAVE_API__gensim__models__fasttext_inner +#include +#include +#include +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include +#include "voidptr.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) && defined (_M_X64) + #define __Pyx_sst_abs(value) _abs64(value) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if PY_MAJOR_VERSION < 3 +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen +#endif +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ + +static PyObject *__pyx_m; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +/* Header.proto */ +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif defined(_Complex_I) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + + +static const char *__pyx_f[] = { + "gensim/models/fasttext_inner.pyx", + "__init__.pxd", + "type.pxd", +}; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":725 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":726 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":727 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":728 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":732 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":733 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":734 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":735 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":739 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":740 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":749 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":750 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_longlong __pyx_t_5numpy_long_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":751 + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":753 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":754 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulonglong __pyx_t_5numpy_ulong_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":755 + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":757 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":758 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":760 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":761 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":762 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; + +/* "word2vec_inner.pxd":12 + * + * cimport numpy as np + * ctypedef np.float32_t REAL_t # <<<<<<<<<<<<<< + * + * # BLAS routine signatures + */ +typedef __pyx_t_5numpy_float32_t __pyx_t_6gensim_6models_14word2vec_inner_REAL_t; +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +/* Declarations.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + + +/*--- Type declarations ---*/ + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":764 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":765 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":766 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":768 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; + +/* "word2vec_inner.pxd":15 + * + * # BLAS routine signatures + * ctypedef void (*scopy_ptr) (const int *N, const float *X, const int *incX, float *Y, const int *incY) nogil # <<<<<<<<<<<<<< + * ctypedef void (*saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil + * ctypedef float (*sdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + */ +typedef void (*__pyx_t_6gensim_6models_14word2vec_inner_scopy_ptr)(int const *, float const *, int const *, float *, int const *); + +/* "word2vec_inner.pxd":16 + * # BLAS routine signatures + * ctypedef void (*scopy_ptr) (const int *N, const float *X, const int *incX, float *Y, const int *incY) nogil + * ctypedef void (*saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil # <<<<<<<<<<<<<< + * ctypedef float (*sdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + * ctypedef double (*dsdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + */ +typedef void (*__pyx_t_6gensim_6models_14word2vec_inner_saxpy_ptr)(int const *, float const *, float const *, int const *, float *, int const *); + +/* "word2vec_inner.pxd":17 + * ctypedef void (*scopy_ptr) (const int *N, const float *X, const int *incX, float *Y, const int *incY) nogil + * ctypedef void (*saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil + * ctypedef float (*sdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil # <<<<<<<<<<<<<< + * ctypedef double (*dsdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + * ctypedef double (*snrm2_ptr) (const int *N, const float *X, const int *incX) nogil + */ +typedef float (*__pyx_t_6gensim_6models_14word2vec_inner_sdot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "word2vec_inner.pxd":18 + * ctypedef void (*saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil + * ctypedef float (*sdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + * ctypedef double (*dsdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil # <<<<<<<<<<<<<< + * ctypedef double (*snrm2_ptr) (const int *N, const float *X, const int *incX) nogil + * ctypedef void (*sscal_ptr) (const int *N, const float *alpha, const float *X, const int *incX) nogil + */ +typedef double (*__pyx_t_6gensim_6models_14word2vec_inner_dsdot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "word2vec_inner.pxd":19 + * ctypedef float (*sdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + * ctypedef double (*dsdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + * ctypedef double (*snrm2_ptr) (const int *N, const float *X, const int *incX) nogil # <<<<<<<<<<<<<< + * ctypedef void (*sscal_ptr) (const int *N, const float *alpha, const float *X, const int *incX) nogil + * + */ +typedef double (*__pyx_t_6gensim_6models_14word2vec_inner_snrm2_ptr)(int const *, float const *, int const *); + +/* "word2vec_inner.pxd":20 + * ctypedef double (*dsdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + * ctypedef double (*snrm2_ptr) (const int *N, const float *X, const int *incX) nogil + * ctypedef void (*sscal_ptr) (const int *N, const float *alpha, const float *X, const int *incX) nogil # <<<<<<<<<<<<<< + * + * cdef scopy_ptr scopy + */ +typedef void (*__pyx_t_6gensim_6models_14word2vec_inner_sscal_ptr)(int const *, float const *, float const *, int const *); + +/* "word2vec_inner.pxd":35 + * + * # function implementations swapped based on BLAS detected in word2vec_inner.pyx init() + * ctypedef REAL_t (*our_dot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil # <<<<<<<<<<<<<< + * ctypedef void (*our_saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil + * + */ +typedef __pyx_t_6gensim_6models_14word2vec_inner_REAL_t (*__pyx_t_6gensim_6models_14word2vec_inner_our_dot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "word2vec_inner.pxd":36 + * # function implementations swapped based on BLAS detected in word2vec_inner.pyx init() + * ctypedef REAL_t (*our_dot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil + * ctypedef void (*our_saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil # <<<<<<<<<<<<<< + * + * cdef our_dot_ptr our_dot + */ +typedef void (*__pyx_t_6gensim_6models_14word2vec_inner_our_saxpy_ptr)(int const *, float const *, float const *, int const *, float *, int const *); + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* GetModuleGlobalName.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#endif + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = PyThreadState_GET(); +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) + PyErr_SetObject(PyExc_KeyError, args); + Py_XDECREF(args); + } + return NULL; + } + Py_INCREF(value); + return value; +} +#else + #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#endif + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* PyObjectCallNoArg.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); +#else +#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_uint32(npy_uint32 value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); + +/* ForceInitThreads.proto */ +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +/* RealImag.proto */ +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if defined(__cplusplus) && CYTHON_CCOMPLEX\ + && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_float(a, b) ((a)==(b)) + #define __Pyx_c_sum_float(a, b) ((a)+(b)) + #define __Pyx_c_diff_float(a, b) ((a)-(b)) + #define __Pyx_c_prod_float(a, b) ((a)*(b)) + #define __Pyx_c_quot_float(a, b) ((a)/(b)) + #define __Pyx_c_neg_float(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_float(z) ((z)==(float)0) + #define __Pyx_c_conj_float(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_float(z) (::std::abs(z)) + #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_float(z) ((z)==0) + #define __Pyx_c_conj_float(z) (conjf(z)) + #if 1 + #define __Pyx_c_abs_float(z) (cabsf(z)) + #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +/* Arithmetic.proto */ +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq_double(a, b) ((a)==(b)) + #define __Pyx_c_sum_double(a, b) ((a)+(b)) + #define __Pyx_c_diff_double(a, b) ((a)-(b)) + #define __Pyx_c_prod_double(a, b) ((a)*(b)) + #define __Pyx_c_quot_double(a, b) ((a)/(b)) + #define __Pyx_c_neg_double(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero_double(z) ((z)==(double)0) + #define __Pyx_c_conj_double(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (::std::abs(z)) + #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero_double(z) ((z)==0) + #define __Pyx_c_conj_double(z) (conj(z)) + #if 1 + #define __Pyx_c_abs_double(z) (cabs(z)) + #define __Pyx_c_pow_double(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_As_PY_LONG_LONG(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE npy_uint32 __Pyx_PyInt_As_npy_uint32(PyObject *); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* PyIdentifierFromString.proto */ +#if !defined(__Pyx_PyIdentifier_FromString) +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) +#else + #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) +#endif +#endif + +/* ModuleImport.proto */ +static PyObject *__Pyx_ImportModule(const char *name); + +/* TypeImport.proto */ +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +/* VoidPtrImport.proto */ +static int __Pyx_ImportVoidPtr(PyObject *module, const char *name, void **p, const char *sig); + +/* FunctionImport.proto */ +static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'cython' */ + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'libc.stdlib' */ + +/* Module declarations from 'numpy' */ + +/* Module declarations from 'numpy' */ +static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; +static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; +static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; +static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ + +/* Module declarations from 'libc.math' */ + +/* Module declarations from 'gensim.models.word2vec_inner' */ +static __pyx_t_6gensim_6models_14word2vec_inner_scopy_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_scopy = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_scopy (*__pyx_vp_6gensim_6models_14word2vec_inner_scopy) +static __pyx_t_6gensim_6models_14word2vec_inner_saxpy_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_saxpy = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_saxpy (*__pyx_vp_6gensim_6models_14word2vec_inner_saxpy) +static __pyx_t_6gensim_6models_14word2vec_inner_sdot_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_sdot = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_sdot (*__pyx_vp_6gensim_6models_14word2vec_inner_sdot) +static __pyx_t_6gensim_6models_14word2vec_inner_dsdot_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_dsdot = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_dsdot (*__pyx_vp_6gensim_6models_14word2vec_inner_dsdot) +static __pyx_t_6gensim_6models_14word2vec_inner_snrm2_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_snrm2 = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_snrm2 (*__pyx_vp_6gensim_6models_14word2vec_inner_snrm2) +static __pyx_t_6gensim_6models_14word2vec_inner_sscal_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_sscal = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_sscal (*__pyx_vp_6gensim_6models_14word2vec_inner_sscal) +static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t (*__pyx_vp_6gensim_6models_14word2vec_inner_EXP_TABLE)[0x3E8] = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE (*__pyx_vp_6gensim_6models_14word2vec_inner_EXP_TABLE) +static __pyx_t_6gensim_6models_14word2vec_inner_our_dot_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_our_dot = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_our_dot (*__pyx_vp_6gensim_6models_14word2vec_inner_our_dot) +static __pyx_t_6gensim_6models_14word2vec_inner_our_saxpy_ptr *__pyx_vp_6gensim_6models_14word2vec_inner_our_saxpy = 0; +#define __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy (*__pyx_vp_6gensim_6models_14word2vec_inner_our_saxpy) +static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t (*__pyx_f_6gensim_6models_14word2vec_inner_our_dot_double)(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t (*__pyx_f_6gensim_6models_14word2vec_inner_our_dot_float)(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t (*__pyx_f_6gensim_6models_14word2vec_inner_our_dot_noblas)(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static void (*__pyx_f_6gensim_6models_14word2vec_inner_our_saxpy_noblas)(int const *, float const *, float const *, int const *, float *, int const *); /*proto*/ +static unsigned PY_LONG_LONG (*__pyx_f_6gensim_6models_14word2vec_inner_bisect_left)(__pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG); /*proto*/ +static unsigned PY_LONG_LONG (*__pyx_f_6gensim_6models_14word2vec_inner_random_int32)(unsigned PY_LONG_LONG *); /*proto*/ + +/* Module declarations from 'gensim.models.fasttext_inner' */ +static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_6gensim_6models_14fasttext_inner_LOG_TABLE[0x3E8]; +static int __pyx_v_6gensim_6models_14fasttext_inner_ONE; +static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_6gensim_6models_14fasttext_inner_ONEF; +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_sg_neg(int const , __pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, int const , __pyx_t_5numpy_uint32_t const , __pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint32_t const , __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const , __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, unsigned PY_LONG_LONG, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *); /*proto*/ +static void __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_sg_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int const , __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint32_t const , __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const , __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *); /*proto*/ +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_cbow_neg(int const , __pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, int *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint32_t const **, int const *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const , __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, int, int, int, int, unsigned PY_LONG_LONG, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *); /*proto*/ +static void __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_cbow_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint32_t const **, int const *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const , __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, int, int, int, int, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *); /*proto*/ +#define __Pyx_MODULE_NAME "gensim.models.fasttext_inner" +int __pyx_module_is_main_gensim__models__fasttext_inner = 0; + +/* Implementation of 'gensim.models.fasttext_inner' */ +static PyObject *__pyx_builtin_ImportError; +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_enumerate; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_RuntimeError; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k_j[] = "j"; +static const char __pyx_k_k[] = "k"; +static const char __pyx_k_x[] = "x"; +static const char __pyx_k_y[] = "y"; +static const char __pyx_k_hs[] = "hs"; +static const char __pyx_k_l1[] = "_l1"; +static const char __pyx_k_np[] = "np"; +static const char __pyx_k_wv[] = "wv"; +static const char __pyx_k__14[] = "*"; +static const char __pyx_k_REAL[] = "REAL"; +static const char __pyx_k_code[] = "code"; +static const char __pyx_k_init[] = "init"; +static const char __pyx_k_item[] = "item"; +static const char __pyx_k_l1_2[] = "l1"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_neu1[] = "_neu1"; +static const char __pyx_k_sent[] = "sent"; +static const char __pyx_k_size[] = "size"; +static const char __pyx_k_syn1[] = "syn1"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_word[] = "word"; +static const char __pyx_k_work[] = "_work"; +static const char __pyx_k_alpha[] = "alpha"; +static const char __pyx_k_array[] = "array"; +static const char __pyx_k_codes[] = "codes"; +static const char __pyx_k_d_res[] = "d_res"; +static const char __pyx_k_dtype[] = "dtype"; +static const char __pyx_k_fblas[] = "fblas"; +static const char __pyx_k_index[] = "index"; +static const char __pyx_k_model[] = "model"; +static const char __pyx_k_numpy[] = "numpy"; +static const char __pyx_k_p_res[] = "p_res"; +static const char __pyx_k_point[] = "point"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_token[] = "token"; +static const char __pyx_k_vocab[] = "vocab"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_neu1_2[] = "neu1"; +static const char __pyx_k_ngrams[] = "ngrams"; +static const char __pyx_k_points[] = "points"; +static const char __pyx_k_random[] = "random"; +static const char __pyx_k_sample[] = "sample"; +static const char __pyx_k_uint32[] = "uint32"; +static const char __pyx_k_window[] = "window"; +static const char __pyx_k_work_2[] = "work"; +static const char __pyx_k_alpha_2[] = "_alpha"; +static const char __pyx_k_float32[] = "float32"; +static const char __pyx_k_idx_end[] = "idx_end"; +static const char __pyx_k_indexes[] = "indexes"; +static const char __pyx_k_randint[] = "randint"; +static const char __pyx_k_syn1neg[] = "syn1neg"; +static const char __pyx_k_vlookup[] = "vlookup"; +static const char __pyx_k_codelens[] = "codelens"; +static const char __pyx_k_expected[] = "expected"; +static const char __pyx_k_negative[] = "negative"; +static const char __pyx_k_sent_idx[] = "sent_idx"; +static const char __pyx_k_subwords[] = "subwords"; +static const char __pyx_k_cbow_mean[] = "cbow_mean"; +static const char __pyx_k_cum_table[] = "cum_table"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_idx_start[] = "idx_start"; +static const char __pyx_k_sentences[] = "sentences"; +static const char __pyx_k_subword_i[] = "subword_i"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_index2word[] = "index2word"; +static const char __pyx_k_sample_int[] = "sample_int"; +static const char __pyx_k_syn0_vocab[] = "syn0_vocab"; +static const char __pyx_k_ImportError[] = "ImportError"; +static const char __pyx_k_layer1_size[] = "layer1_size"; +static const char __pyx_k_next_random[] = "next_random"; +static const char __pyx_k_ngrams_word[] = "ngrams_word"; +static const char __pyx_k_syn0_ngrams[] = "syn0_ngrams"; +static const char __pyx_k_FAST_VERSION[] = "FAST_VERSION"; +static const char __pyx_k_RuntimeError[] = "RuntimeError"; +static const char __pyx_k_sentence_idx[] = "sentence_idx"; +static const char __pyx_k_subwords_idx[] = "subwords_idx"; +static const char __pyx_k_cum_table_len[] = "cum_table_len"; +static const char __pyx_k_word_subwords[] = "word_subwords"; +static const char __pyx_k_subword_arrays[] = "subword_arrays"; +static const char __pyx_k_train_batch_sg[] = "train_batch_sg"; +static const char __pyx_k_effective_words[] = "effective_words"; +static const char __pyx_k_reduced_windows[] = "reduced_windows"; +static const char __pyx_k_subwords_idx_len[] = "subwords_idx_len"; +static const char __pyx_k_syn0_vocab_lockf[] = "syn0_vocab_lockf"; +static const char __pyx_k_train_batch_cbow[] = "train_batch_cbow"; +static const char __pyx_k_word_locks_vocab[] = "word_locks_vocab"; +static const char __pyx_k_scipy_linalg_blas[] = "scipy.linalg.blas"; +static const char __pyx_k_syn0_ngrams_lockf[] = "syn0_ngrams_lockf"; +static const char __pyx_k_word_locks_ngrams[] = "word_locks_ngrams"; +static const char __pyx_k_MAX_WORDS_IN_BATCH[] = "MAX_WORDS_IN_BATCH"; +static const char __pyx_k_effective_sentences[] = "effective_sentences"; +static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static const char __pyx_k_gensim_models_fasttext_inner[] = "gensim.models.fasttext_inner"; +static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; +static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static const char __pyx_k_gensim_models_fasttext_inner_pyx[] = "gensim/models/fasttext_inner.pyx"; +static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; +static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_FAST_VERSION; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; +static PyObject *__pyx_n_s_ImportError; +static PyObject *__pyx_n_s_MAX_WORDS_IN_BATCH; +static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; +static PyObject *__pyx_n_s_REAL; +static PyObject *__pyx_n_s_RuntimeError; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_n_s__14; +static PyObject *__pyx_n_s_alpha; +static PyObject *__pyx_n_s_alpha_2; +static PyObject *__pyx_n_s_array; +static PyObject *__pyx_n_s_cbow_mean; +static PyObject *__pyx_n_s_code; +static PyObject *__pyx_n_s_codelens; +static PyObject *__pyx_n_s_codes; +static PyObject *__pyx_n_s_cum_table; +static PyObject *__pyx_n_s_cum_table_len; +static PyObject *__pyx_n_s_d_res; +static PyObject *__pyx_n_s_dtype; +static PyObject *__pyx_n_s_effective_sentences; +static PyObject *__pyx_n_s_effective_words; +static PyObject *__pyx_n_s_enumerate; +static PyObject *__pyx_n_s_expected; +static PyObject *__pyx_n_s_fblas; +static PyObject *__pyx_n_s_float32; +static PyObject *__pyx_n_s_gensim_models_fasttext_inner; +static PyObject *__pyx_kp_s_gensim_models_fasttext_inner_pyx; +static PyObject *__pyx_n_s_hs; +static PyObject *__pyx_n_s_i; +static PyObject *__pyx_n_s_idx_end; +static PyObject *__pyx_n_s_idx_start; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_index; +static PyObject *__pyx_n_s_index2word; +static PyObject *__pyx_n_s_indexes; +static PyObject *__pyx_n_s_init; +static PyObject *__pyx_n_s_item; +static PyObject *__pyx_n_s_j; +static PyObject *__pyx_n_s_k; +static PyObject *__pyx_n_s_l1; +static PyObject *__pyx_n_s_l1_2; +static PyObject *__pyx_n_s_layer1_size; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_model; +static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; +static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; +static PyObject *__pyx_n_s_negative; +static PyObject *__pyx_n_s_neu1; +static PyObject *__pyx_n_s_neu1_2; +static PyObject *__pyx_n_s_next_random; +static PyObject *__pyx_n_s_ngrams; +static PyObject *__pyx_n_s_ngrams_word; +static PyObject *__pyx_n_s_np; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; +static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; +static PyObject *__pyx_n_s_p_res; +static PyObject *__pyx_n_s_point; +static PyObject *__pyx_n_s_points; +static PyObject *__pyx_n_s_randint; +static PyObject *__pyx_n_s_random; +static PyObject *__pyx_n_s_range; +static PyObject *__pyx_n_s_reduced_windows; +static PyObject *__pyx_n_s_sample; +static PyObject *__pyx_n_s_sample_int; +static PyObject *__pyx_n_s_scipy_linalg_blas; +static PyObject *__pyx_n_s_sent; +static PyObject *__pyx_n_s_sent_idx; +static PyObject *__pyx_n_s_sentence_idx; +static PyObject *__pyx_n_s_sentences; +static PyObject *__pyx_n_s_size; +static PyObject *__pyx_n_s_subword_arrays; +static PyObject *__pyx_n_s_subword_i; +static PyObject *__pyx_n_s_subwords; +static PyObject *__pyx_n_s_subwords_idx; +static PyObject *__pyx_n_s_subwords_idx_len; +static PyObject *__pyx_n_s_syn0_ngrams; +static PyObject *__pyx_n_s_syn0_ngrams_lockf; +static PyObject *__pyx_n_s_syn0_vocab; +static PyObject *__pyx_n_s_syn0_vocab_lockf; +static PyObject *__pyx_n_s_syn1; +static PyObject *__pyx_n_s_syn1neg; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_token; +static PyObject *__pyx_n_s_train_batch_cbow; +static PyObject *__pyx_n_s_train_batch_sg; +static PyObject *__pyx_n_s_uint32; +static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; +static PyObject *__pyx_n_s_vlookup; +static PyObject *__pyx_n_s_vocab; +static PyObject *__pyx_n_s_window; +static PyObject *__pyx_n_s_word; +static PyObject *__pyx_n_s_word_locks_ngrams; +static PyObject *__pyx_n_s_word_locks_vocab; +static PyObject *__pyx_n_s_word_subwords; +static PyObject *__pyx_n_s_work; +static PyObject *__pyx_n_s_work_2; +static PyObject *__pyx_n_s_wv; +static PyObject *__pyx_n_s_x; +static PyObject *__pyx_n_s_y; +static PyObject *__pyx_pf_6gensim_6models_14fasttext_inner_train_batch_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work, PyObject *__pyx_v__l1); /* proto */ +static PyObject *__pyx_pf_6gensim_6models_14fasttext_inner_2train_batch_cbow(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work, PyObject *__pyx_v__neu1); /* proto */ +static PyObject *__pyx_pf_6gensim_6models_14fasttext_inner_4init(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_2; +static PyObject *__pyx_int_10000; +static PyObject *__pyx_int_16777216; +static PyObject *__pyx_tuple_; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__6; +static PyObject *__pyx_tuple__7; +static PyObject *__pyx_tuple__8; +static PyObject *__pyx_tuple__9; +static PyObject *__pyx_tuple__10; +static PyObject *__pyx_tuple__11; +static PyObject *__pyx_tuple__12; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_tuple__15; +static PyObject *__pyx_tuple__17; +static PyObject *__pyx_tuple__19; +static PyObject *__pyx_codeobj__16; +static PyObject *__pyx_codeobj__18; +static PyObject *__pyx_codeobj__20; + +/* "gensim/models/fasttext_inner.pyx":43 + * + * + * cdef unsigned long long fast_sentence_sg_neg( # <<<<<<<<<<<<<< + * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, + * REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1neg, const int size, + */ + +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_sg_neg(int const __pyx_v_negative, __pyx_t_5numpy_uint32_t *__pyx_v_cum_table, unsigned PY_LONG_LONG __pyx_v_cum_table_len, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_ngrams, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1neg, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const __pyx_v_word_index, __pyx_t_5numpy_uint32_t const *__pyx_v_subwords_index, __pyx_t_5numpy_uint32_t const __pyx_v_subwords_len, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_work, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_l1, unsigned PY_LONG_LONG __pyx_v_next_random, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_ngrams) { + __pyx_t_5numpy_uint32_t __pyx_v_word2_index; + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + unsigned PY_LONG_LONG __pyx_v_modulo; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_g; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_label; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f_dot; + __pyx_t_5numpy_uint32_t __pyx_v_target_index; + int __pyx_v_d; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_norm_factor; + unsigned PY_LONG_LONG __pyx_r; + __pyx_t_5numpy_uint32_t __pyx_t_1; + int __pyx_t_2; + long __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + + /* "gensim/models/fasttext_inner.pyx":51 + * + * cdef long long a + * cdef np.uint32_t word2_index = subwords_index[0] # <<<<<<<<<<<<<< + * cdef long long row1 = word2_index * size, row2 + * cdef unsigned long long modulo = 281474976710655ULL + */ + __pyx_v_word2_index = (__pyx_v_subwords_index[0]); + + /* "gensim/models/fasttext_inner.pyx":52 + * cdef long long a + * cdef np.uint32_t word2_index = subwords_index[0] + * cdef long long row1 = word2_index * size, row2 # <<<<<<<<<<<<<< + * cdef unsigned long long modulo = 281474976710655ULL + * cdef REAL_t f, g, label, f_dot, log_e_f_dot + */ + __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); + + /* "gensim/models/fasttext_inner.pyx":53 + * cdef np.uint32_t word2_index = subwords_index[0] + * cdef long long row1 = word2_index * size, row2 + * cdef unsigned long long modulo = 281474976710655ULL # <<<<<<<<<<<<<< + * cdef REAL_t f, g, label, f_dot, log_e_f_dot + * cdef np.uint32_t target_index + */ + __pyx_v_modulo = 281474976710655ULL; + + /* "gensim/models/fasttext_inner.pyx":58 + * cdef int d + * + * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * memset(l1, 0, size * cython.sizeof(REAL_t)) + * + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":59 + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + * memset(l1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + */ + memset(__pyx_v_l1, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":61 + * memset(l1, 0, size * cython.sizeof(REAL_t)) + * + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) # <<<<<<<<<<<<<< + * for d in range(1, subwords_len): + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_scopy((&__pyx_v_size), (&(__pyx_v_syn0_vocab[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":62 + * + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + * for d in range(1, subwords_len): # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + * cdef REAL_t norm_factor = ONEF / subwords_len + */ + __pyx_t_1 = __pyx_v_subwords_len; + for (__pyx_t_2 = 1; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_d = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":63 + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + * for d in range(1, subwords_len): + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) # <<<<<<<<<<<<<< + * cdef REAL_t norm_factor = ONEF / subwords_len + * sscal(&size, &norm_factor, l1 , &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_14fasttext_inner_ONEF), (&(__pyx_v_syn0_ngrams[((__pyx_v_subwords_index[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + + /* "gensim/models/fasttext_inner.pyx":64 + * for d in range(1, subwords_len): + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + * cdef REAL_t norm_factor = ONEF / subwords_len # <<<<<<<<<<<<<< + * sscal(&size, &norm_factor, l1 , &ONE) + * + */ + __pyx_v_norm_factor = (__pyx_v_6gensim_6models_14fasttext_inner_ONEF / __pyx_v_subwords_len); + + /* "gensim/models/fasttext_inner.pyx":65 + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + * cdef REAL_t norm_factor = ONEF / subwords_len + * sscal(&size, &norm_factor, l1 , &ONE) # <<<<<<<<<<<<<< + * + * for d in range(negative+1): + */ + __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_norm_factor), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":67 + * sscal(&size, &norm_factor, l1 , &ONE) + * + * for d in range(negative+1): # <<<<<<<<<<<<<< + * if d == 0: + * target_index = word_index + */ + __pyx_t_3 = (__pyx_v_negative + 1); + for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2+=1) { + __pyx_v_d = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":68 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + __pyx_t_4 = ((__pyx_v_d == 0) != 0); + if (__pyx_t_4) { + + /* "gensim/models/fasttext_inner.pyx":69 + * for d in range(negative+1): + * if d == 0: + * target_index = word_index # <<<<<<<<<<<<<< + * label = ONEF + * else: + */ + __pyx_v_target_index = __pyx_v_word_index; + + /* "gensim/models/fasttext_inner.pyx":70 + * if d == 0: + * target_index = word_index + * label = ONEF # <<<<<<<<<<<<<< + * else: + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + */ + __pyx_v_label = __pyx_v_6gensim_6models_14fasttext_inner_ONEF; + + /* "gensim/models/fasttext_inner.pyx":68 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + goto __pyx_L7; + } + + /* "gensim/models/fasttext_inner.pyx":72 + * label = ONEF + * else: + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) # <<<<<<<<<<<<<< + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + */ + /*else*/ { + __pyx_v_target_index = __pyx_f_6gensim_6models_14word2vec_inner_bisect_left(__pyx_v_cum_table, ((__pyx_v_next_random >> 16) % (__pyx_v_cum_table[(__pyx_v_cum_table_len - 1)])), 0, __pyx_v_cum_table_len); + + /* "gensim/models/fasttext_inner.pyx":73 + * else: + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + * next_random = (next_random * 25214903917ULL + 11) & modulo # <<<<<<<<<<<<<< + * if target_index == word_index: + * continue + */ + __pyx_v_next_random = (((__pyx_v_next_random * ((unsigned PY_LONG_LONG)25214903917ULL)) + 11) & __pyx_v_modulo); + + /* "gensim/models/fasttext_inner.pyx":74 + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: # <<<<<<<<<<<<<< + * continue + * label = 0.0 + */ + __pyx_t_4 = ((__pyx_v_target_index == __pyx_v_word_index) != 0); + if (__pyx_t_4) { + + /* "gensim/models/fasttext_inner.pyx":75 + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + * continue # <<<<<<<<<<<<<< + * label = 0.0 + * + */ + goto __pyx_L5_continue; + + /* "gensim/models/fasttext_inner.pyx":74 + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: # <<<<<<<<<<<<<< + * continue + * label = 0.0 + */ + } + + /* "gensim/models/fasttext_inner.pyx":76 + * if target_index == word_index: + * continue + * label = 0.0 # <<<<<<<<<<<<<< + * + * row2 = target_index * size + */ + __pyx_v_label = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); + } + __pyx_L7:; + + /* "gensim/models/fasttext_inner.pyx":78 + * label = 0.0 + * + * row2 = target_index * size # <<<<<<<<<<<<<< + * f_dot = our_dot(&size, l1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + */ + __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); + + /* "gensim/models/fasttext_inner.pyx":79 + * + * row2 = target_index * size + * f_dot = our_dot(&size, l1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + */ + __pyx_v_f_dot = __pyx_v_6gensim_6models_14word2vec_inner_our_dot((&__pyx_v_size), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":80 + * row2 = target_index * size + * f_dot = our_dot(&size, l1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_5 = ((__pyx_v_f_dot <= -6.0) != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_4 = __pyx_t_5; + goto __pyx_L10_bool_binop_done; + } + __pyx_t_5 = ((__pyx_v_f_dot >= 6.0) != 0); + __pyx_t_4 = __pyx_t_5; + __pyx_L10_bool_binop_done:; + if (__pyx_t_4) { + + /* "gensim/models/fasttext_inner.pyx":81 + * f_dot = our_dot(&size, l1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha + */ + goto __pyx_L5_continue; + + /* "gensim/models/fasttext_inner.pyx":80 + * row2 = target_index * size + * f_dot = our_dot(&size, l1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/fasttext_inner.pyx":82 + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * g = (label - f) * alpha + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + */ + __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); + + /* "gensim/models/fasttext_inner.pyx":83 + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha # <<<<<<<<<<<<<< + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + * our_saxpy(&size, &g, l1, &ONE, &syn1neg[row2], &ONE) + */ + __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/fasttext_inner.pyx":84 + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< + * our_saxpy(&size, &g, l1, &ONE, &syn1neg[row2], &ONE) + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":85 + * g = (label - f) * alpha + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + * our_saxpy(&size, &g, l1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + * for d in range(1, subwords_len): + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + __pyx_L5_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":86 + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + * our_saxpy(&size, &g, l1, &ONE, &syn1neg[row2], &ONE) + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) # <<<<<<<<<<<<<< + * for d in range(1, subwords_len): + * our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_vocab[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_vocab[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":87 + * our_saxpy(&size, &g, l1, &ONE, &syn1neg[row2], &ONE) + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + * for d in range(1, subwords_len): # <<<<<<<<<<<<<< + * our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) + * return next_random + */ + __pyx_t_1 = __pyx_v_subwords_len; + for (__pyx_t_2 = 1; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_d = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":88 + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + * for d in range(1, subwords_len): + * our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) # <<<<<<<<<<<<<< + * return next_random + * + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_ngrams[(__pyx_v_subwords_index[__pyx_v_d])])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_ngrams[((__pyx_v_subwords_index[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + + /* "gensim/models/fasttext_inner.pyx":89 + * for d in range(1, subwords_len): + * our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) + * return next_random # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_next_random; + goto __pyx_L0; + + /* "gensim/models/fasttext_inner.pyx":43 + * + * + * cdef unsigned long long fast_sentence_sg_neg( # <<<<<<<<<<<<<< + * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, + * REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1neg, const int size, + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/fasttext_inner.pyx":92 + * + * + * cdef void fast_sentence_sg_hs( # <<<<<<<<<<<<<< + * const np.uint32_t *word_point, const np.uint8_t *word_code, const int codelen, + * REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1, const int size, + */ + +static void __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_sg_hs(__pyx_t_5numpy_uint32_t const *__pyx_v_word_point, __pyx_t_5numpy_uint8_t const *__pyx_v_word_code, int const __pyx_v_codelen, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_ngrams, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_subwords_index, __pyx_t_5numpy_uint32_t const __pyx_v_subwords_len, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_work, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_l1, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_ngrams) { + PY_LONG_LONG __pyx_v_b; + __pyx_t_5numpy_uint32_t __pyx_v_word2_index; + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_g; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f_dot; + long __pyx_v_d; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_norm_factor; + __pyx_t_5numpy_uint32_t __pyx_t_1; + long __pyx_t_2; + int __pyx_t_3; + PY_LONG_LONG __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + + /* "gensim/models/fasttext_inner.pyx":100 + * + * cdef long long a, b + * cdef np.uint32_t word2_index = subwords_index[0] # <<<<<<<<<<<<<< + * cdef long long row1 = word2_index * size, row2, sgn + * cdef REAL_t f, g, f_dot, lprob + */ + __pyx_v_word2_index = (__pyx_v_subwords_index[0]); + + /* "gensim/models/fasttext_inner.pyx":101 + * cdef long long a, b + * cdef np.uint32_t word2_index = subwords_index[0] + * cdef long long row1 = word2_index * size, row2, sgn # <<<<<<<<<<<<<< + * cdef REAL_t f, g, f_dot, lprob + * + */ + __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); + + /* "gensim/models/fasttext_inner.pyx":104 + * cdef REAL_t f, g, f_dot, lprob + * + * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * memset(l1, 0, size * cython.sizeof(REAL_t)) + * + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":105 + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + * memset(l1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + */ + memset(__pyx_v_l1, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":107 + * memset(l1, 0, size * cython.sizeof(REAL_t)) + * + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) # <<<<<<<<<<<<<< + * for d in range(1, subwords_len): + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_scopy((&__pyx_v_size), (&(__pyx_v_syn0_vocab[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":108 + * + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + * for d in range(1, subwords_len): # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + * cdef REAL_t norm_factor = ONEF / subwords_len + */ + __pyx_t_1 = __pyx_v_subwords_len; + for (__pyx_t_2 = 1; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_d = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":109 + * scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + * for d in range(1, subwords_len): + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) # <<<<<<<<<<<<<< + * cdef REAL_t norm_factor = ONEF / subwords_len + * sscal(&size, &norm_factor, l1 , &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_14fasttext_inner_ONEF), (&(__pyx_v_syn0_ngrams[((__pyx_v_subwords_index[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + + /* "gensim/models/fasttext_inner.pyx":110 + * for d in range(1, subwords_len): + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + * cdef REAL_t norm_factor = ONEF / subwords_len # <<<<<<<<<<<<<< + * sscal(&size, &norm_factor, l1 , &ONE) + * + */ + __pyx_v_norm_factor = (__pyx_v_6gensim_6models_14fasttext_inner_ONEF / __pyx_v_subwords_len); + + /* "gensim/models/fasttext_inner.pyx":111 + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + * cdef REAL_t norm_factor = ONEF / subwords_len + * sscal(&size, &norm_factor, l1 , &ONE) # <<<<<<<<<<<<<< + * + * for b in range(codelen): + */ + __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_norm_factor), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":113 + * sscal(&size, &norm_factor, l1 , &ONE) + * + * for b in range(codelen): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f_dot = our_dot(&size, l1, &ONE, &syn1[row2], &ONE) + */ + __pyx_t_3 = __pyx_v_codelen; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_b = __pyx_t_4; + + /* "gensim/models/fasttext_inner.pyx":114 + * + * for b in range(codelen): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f_dot = our_dot(&size, l1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "gensim/models/fasttext_inner.pyx":115 + * for b in range(codelen): + * row2 = word_point[b] * size + * f_dot = our_dot(&size, l1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + */ + __pyx_v_f_dot = __pyx_v_6gensim_6models_14word2vec_inner_our_dot((&__pyx_v_size), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":116 + * row2 = word_point[b] * size + * f_dot = our_dot(&size, l1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_6 = ((__pyx_v_f_dot <= -6.0) != 0); + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_6 = ((__pyx_v_f_dot >= 6.0) != 0); + __pyx_t_5 = __pyx_t_6; + __pyx_L8_bool_binop_done:; + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":117 + * f_dot = our_dot(&size, l1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha + */ + goto __pyx_L5_continue; + + /* "gensim/models/fasttext_inner.pyx":116 + * row2 = word_point[b] * size + * f_dot = our_dot(&size, l1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/fasttext_inner.pyx":118 + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * g = (1 - word_code[b] - f) * alpha + * + */ + __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); + + /* "gensim/models/fasttext_inner.pyx":119 + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha # <<<<<<<<<<<<<< + * + * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) + */ + __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/fasttext_inner.pyx":121 + * g = (1 - word_code[b] - f) * alpha + * + * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< + * our_saxpy(&size, &g, l1, &ONE, &syn1[row2], &ONE) + * + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":122 + * + * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) + * our_saxpy(&size, &g, l1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_l1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + __pyx_L5_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":124 + * our_saxpy(&size, &g, l1, &ONE, &syn1[row2], &ONE) + * + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) # <<<<<<<<<<<<<< + * for d in range(1, subwords_len): + * our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_vocab[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_vocab[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":125 + * + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + * for d in range(1, subwords_len): # <<<<<<<<<<<<<< + * our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) + * + */ + __pyx_t_1 = __pyx_v_subwords_len; + for (__pyx_t_2 = 1; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_d = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":126 + * our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + * for d in range(1, subwords_len): + * our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_ngrams[(__pyx_v_subwords_index[__pyx_v_d])])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_ngrams[((__pyx_v_subwords_index[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + + /* "gensim/models/fasttext_inner.pyx":92 + * + * + * cdef void fast_sentence_sg_hs( # <<<<<<<<<<<<<< + * const np.uint32_t *word_point, const np.uint8_t *word_code, const int codelen, + * REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1, const int size, + */ + + /* function exit code */ +} + +/* "gensim/models/fasttext_inner.pyx":129 + * + * + * cdef unsigned long long fast_sentence_cbow_neg( # <<<<<<<<<<<<<< + * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, int codelens[MAX_SENTENCE_LEN], + * REAL_t *neu1, REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1neg, const int size, + */ + +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_cbow_neg(int const __pyx_v_negative, __pyx_t_5numpy_uint32_t *__pyx_v_cum_table, unsigned PY_LONG_LONG __pyx_v_cum_table_len, CYTHON_UNUSED int *__pyx_v_codelens, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_neu1, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_ngrams, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1neg, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_5numpy_uint32_t const **__pyx_v_subwords_idx, int const *__pyx_v_subwords_idx_len, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_work, int __pyx_v_i, int __pyx_v_j, int __pyx_v_k, int __pyx_v_cbow_mean, unsigned PY_LONG_LONG __pyx_v_next_random, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_ngrams) { + PY_LONG_LONG __pyx_v_row2; + unsigned PY_LONG_LONG __pyx_v_modulo; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_g; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_count; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_inv_count; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_label; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f_dot; + __pyx_t_5numpy_uint32_t __pyx_v_target_index; + __pyx_t_5numpy_uint32_t __pyx_v_word_index; + int __pyx_v_d; + int __pyx_v_m; + unsigned PY_LONG_LONG __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + long __pyx_t_6; + int __pyx_t_7; + + /* "gensim/models/fasttext_inner.pyx":138 + * cdef long long a + * cdef long long row2 + * cdef unsigned long long modulo = 281474976710655ULL # <<<<<<<<<<<<<< + * cdef REAL_t f, g, count, inv_count = 1.0, label, log_e_f_dot, f_dot + * cdef np.uint32_t target_index, word_index + */ + __pyx_v_modulo = 281474976710655ULL; + + /* "gensim/models/fasttext_inner.pyx":139 + * cdef long long row2 + * cdef unsigned long long modulo = 281474976710655ULL + * cdef REAL_t f, g, count, inv_count = 1.0, label, log_e_f_dot, f_dot # <<<<<<<<<<<<<< + * cdef np.uint32_t target_index, word_index + * cdef int d, m + */ + __pyx_v_inv_count = 1.0; + + /* "gensim/models/fasttext_inner.pyx":143 + * cdef int d, m + * + * word_index = indexes[i] # <<<<<<<<<<<<<< + * + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + */ + __pyx_v_word_index = (__pyx_v_indexes[__pyx_v_i]); + + /* "gensim/models/fasttext_inner.pyx":145 + * word_index = indexes[i] + * + * memset(neu1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * count = 0.0 + * for m in range(j, k): + */ + memset(__pyx_v_neu1, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":146 + * + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 # <<<<<<<<<<<<<< + * for m in range(j, k): + * if m == i: + */ + __pyx_v_count = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); + + /* "gensim/models/fasttext_inner.pyx":147 + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 + * for m in range(j, k): # <<<<<<<<<<<<<< + * if m == i: + * continue + */ + __pyx_t_1 = __pyx_v_k; + for (__pyx_t_2 = __pyx_v_j; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_m = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":148 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * count += ONEF + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":149 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + */ + goto __pyx_L3_continue; + + /* "gensim/models/fasttext_inner.pyx":148 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * count += ONEF + */ + } + + /* "gensim/models/fasttext_inner.pyx":150 + * if m == i: + * continue + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + * for d in range(subwords_idx_len[m]): + */ + __pyx_v_count = (__pyx_v_count + __pyx_v_6gensim_6models_14fasttext_inner_ONEF); + + /* "gensim/models/fasttext_inner.pyx":151 + * continue + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * for d in range(subwords_idx_len[m]): + * count += ONEF + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_14fasttext_inner_ONEF), (&(__pyx_v_syn0_vocab[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":152 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + * for d in range(subwords_idx_len[m]): # <<<<<<<<<<<<<< + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + */ + __pyx_t_4 = (__pyx_v_subwords_idx_len[__pyx_v_m]); + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_d = __pyx_t_5; + + /* "gensim/models/fasttext_inner.pyx":153 + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + * for d in range(subwords_idx_len[m]): + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + * + */ + __pyx_v_count = (__pyx_v_count + __pyx_v_6gensim_6models_14fasttext_inner_ONEF); + + /* "gensim/models/fasttext_inner.pyx":154 + * for d in range(subwords_idx_len[m]): + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * + * if count > (0.5): + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_14fasttext_inner_ONEF), (&(__pyx_v_syn0_ngrams[(((__pyx_v_subwords_idx[__pyx_v_m])[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + __pyx_L3_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":156 + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + * + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF / count + * if cbow_mean: + */ + __pyx_t_3 = ((__pyx_v_count > ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":157 + * + * if count > (0.5): + * inv_count = ONEF / count # <<<<<<<<<<<<<< + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) + */ + __pyx_v_inv_count = (__pyx_v_6gensim_6models_14fasttext_inner_ONEF / __pyx_v_count); + + /* "gensim/models/fasttext_inner.pyx":156 + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + * + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF / count + * if cbow_mean: + */ + } + + /* "gensim/models/fasttext_inner.pyx":158 + * if count > (0.5): + * inv_count = ONEF / count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) + * + */ + __pyx_t_3 = (__pyx_v_cbow_mean != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":159 + * inv_count = ONEF / count + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # <<<<<<<<<<<<<< + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + */ + __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":158 + * if count > (0.5): + * inv_count = ONEF / count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":161 + * sscal(&size, &inv_count, neu1, &ONE) + * + * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * + * for d in range(negative+1): + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":163 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * + * for d in range(negative+1): # <<<<<<<<<<<<<< + * if d == 0: + * target_index = word_index + */ + __pyx_t_6 = (__pyx_v_negative + 1); + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_6; __pyx_t_1+=1) { + __pyx_v_d = __pyx_t_1; + + /* "gensim/models/fasttext_inner.pyx":164 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + __pyx_t_3 = ((__pyx_v_d == 0) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":165 + * for d in range(negative+1): + * if d == 0: + * target_index = word_index # <<<<<<<<<<<<<< + * label = ONEF + * else: + */ + __pyx_v_target_index = __pyx_v_word_index; + + /* "gensim/models/fasttext_inner.pyx":166 + * if d == 0: + * target_index = word_index + * label = ONEF # <<<<<<<<<<<<<< + * else: + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + */ + __pyx_v_label = __pyx_v_6gensim_6models_14fasttext_inner_ONEF; + + /* "gensim/models/fasttext_inner.pyx":164 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + goto __pyx_L12; + } + + /* "gensim/models/fasttext_inner.pyx":168 + * label = ONEF + * else: + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) # <<<<<<<<<<<<<< + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + */ + /*else*/ { + __pyx_v_target_index = __pyx_f_6gensim_6models_14word2vec_inner_bisect_left(__pyx_v_cum_table, ((__pyx_v_next_random >> 16) % (__pyx_v_cum_table[(__pyx_v_cum_table_len - 1)])), 0, __pyx_v_cum_table_len); + + /* "gensim/models/fasttext_inner.pyx":169 + * else: + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + * next_random = (next_random * 25214903917ULL + 11) & modulo # <<<<<<<<<<<<<< + * if target_index == word_index: + * continue + */ + __pyx_v_next_random = (((__pyx_v_next_random * ((unsigned PY_LONG_LONG)25214903917ULL)) + 11) & __pyx_v_modulo); + + /* "gensim/models/fasttext_inner.pyx":170 + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: # <<<<<<<<<<<<<< + * continue + * label = 0.0 + */ + __pyx_t_3 = ((__pyx_v_target_index == __pyx_v_word_index) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":171 + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + * continue # <<<<<<<<<<<<<< + * label = 0.0 + * + */ + goto __pyx_L10_continue; + + /* "gensim/models/fasttext_inner.pyx":170 + * target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: # <<<<<<<<<<<<<< + * continue + * label = 0.0 + */ + } + + /* "gensim/models/fasttext_inner.pyx":172 + * if target_index == word_index: + * continue + * label = 0.0 # <<<<<<<<<<<<<< + * + * row2 = target_index * size + */ + __pyx_v_label = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); + } + __pyx_L12:; + + /* "gensim/models/fasttext_inner.pyx":174 + * label = 0.0 + * + * row2 = target_index * size # <<<<<<<<<<<<<< + * f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + */ + __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); + + /* "gensim/models/fasttext_inner.pyx":175 + * + * row2 = target_index * size + * f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + */ + __pyx_v_f_dot = __pyx_v_6gensim_6models_14word2vec_inner_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":176 + * row2 = target_index * size + * f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_7 = ((__pyx_v_f_dot <= -6.0) != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_3 = __pyx_t_7; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_7 = ((__pyx_v_f_dot >= 6.0) != 0); + __pyx_t_3 = __pyx_t_7; + __pyx_L15_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":177 + * f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha + */ + goto __pyx_L10_continue; + + /* "gensim/models/fasttext_inner.pyx":176 + * row2 = target_index * size + * f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/fasttext_inner.pyx":178 + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * g = (label - f) * alpha + * + */ + __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); + + /* "gensim/models/fasttext_inner.pyx":179 + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha # <<<<<<<<<<<<<< + * + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + */ + __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/fasttext_inner.pyx":181 + * g = (label - f) * alpha + * + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< + * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) + * + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":182 + * + * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * + * if not cbow_mean: # divide error over summed window vectors + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + __pyx_L10_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":184 + * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) + * + * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, work, &ONE) + * + */ + __pyx_t_3 = ((!(__pyx_v_cbow_mean != 0)) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":185 + * + * if not cbow_mean: # divide error over summed window vectors + * sscal(&size, &inv_count, work, &ONE) # <<<<<<<<<<<<<< + * + * for m in range(j,k): + */ + __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":184 + * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) + * + * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, work, &ONE) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":187 + * sscal(&size, &inv_count, work, &ONE) + * + * for m in range(j,k): # <<<<<<<<<<<<<< + * if m == i: + * continue + */ + __pyx_t_1 = __pyx_v_k; + for (__pyx_t_2 = __pyx_v_j; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_m = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":188 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":189 + * for m in range(j,k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + * for d in range(subwords_idx_len[m]): + */ + goto __pyx_L18_continue; + + /* "gensim/models/fasttext_inner.pyx":188 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + */ + } + + /* "gensim/models/fasttext_inner.pyx":190 + * if m == i: + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) # <<<<<<<<<<<<<< + * for d in range(subwords_idx_len[m]): + * our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_vocab[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_vocab[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":191 + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + * for d in range(subwords_idx_len[m]): # <<<<<<<<<<<<<< + * our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) + * + */ + __pyx_t_4 = (__pyx_v_subwords_idx_len[__pyx_v_m]); + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_d = __pyx_t_5; + + /* "gensim/models/fasttext_inner.pyx":192 + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + * for d in range(subwords_idx_len[m]): + * our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) # <<<<<<<<<<<<<< + * + * return next_random + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_ngrams[((__pyx_v_subwords_idx[__pyx_v_m])[__pyx_v_d])])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_ngrams[(((__pyx_v_subwords_idx[__pyx_v_m])[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + __pyx_L18_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":194 + * our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) + * + * return next_random # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_next_random; + goto __pyx_L0; + + /* "gensim/models/fasttext_inner.pyx":129 + * + * + * cdef unsigned long long fast_sentence_cbow_neg( # <<<<<<<<<<<<<< + * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, int codelens[MAX_SENTENCE_LEN], + * REAL_t *neu1, REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1neg, const int size, + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/fasttext_inner.pyx":197 + * + * + * cdef void fast_sentence_cbow_hs( # <<<<<<<<<<<<<< + * const np.uint32_t *word_point, const np.uint8_t *word_code, int codelens[MAX_SENTENCE_LEN], + * REAL_t *neu1, REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1, const int size, + */ + +static void __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_cbow_hs(__pyx_t_5numpy_uint32_t const *__pyx_v_word_point, __pyx_t_5numpy_uint8_t const *__pyx_v_word_code, int *__pyx_v_codelens, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_neu1, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_ngrams, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_5numpy_uint32_t const **__pyx_v_subwords_idx, int const *__pyx_v_subwords_idx_len, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_work, int __pyx_v_i, int __pyx_v_j, int __pyx_v_k, int __pyx_v_cbow_mean, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_vocab, __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_ngrams) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_g; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_count; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_inv_count; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v_f_dot; + int __pyx_v_m; + int __pyx_v_d; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PY_LONG_LONG __pyx_t_6; + int __pyx_t_7; + + /* "gensim/models/fasttext_inner.pyx":206 + * cdef long long a, b + * cdef long long row2, sgn + * cdef REAL_t f, g, count, inv_count = 1.0, f_dot, lprob # <<<<<<<<<<<<<< + * cdef int m + * + */ + __pyx_v_inv_count = 1.0; + + /* "gensim/models/fasttext_inner.pyx":209 + * cdef int m + * + * memset(neu1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * count = 0.0 + * for m in range(j, k): + */ + memset(__pyx_v_neu1, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":210 + * + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 # <<<<<<<<<<<<<< + * for m in range(j, k): + * if m == i: + */ + __pyx_v_count = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); + + /* "gensim/models/fasttext_inner.pyx":211 + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 + * for m in range(j, k): # <<<<<<<<<<<<<< + * if m == i: + * continue + */ + __pyx_t_1 = __pyx_v_k; + for (__pyx_t_2 = __pyx_v_j; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_m = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":212 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * count += ONEF + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":213 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + */ + goto __pyx_L3_continue; + + /* "gensim/models/fasttext_inner.pyx":212 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * count += ONEF + */ + } + + /* "gensim/models/fasttext_inner.pyx":214 + * if m == i: + * continue + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + * for d in range(subwords_idx_len[m]): + */ + __pyx_v_count = (__pyx_v_count + __pyx_v_6gensim_6models_14fasttext_inner_ONEF); + + /* "gensim/models/fasttext_inner.pyx":215 + * continue + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * for d in range(subwords_idx_len[m]): + * count += ONEF + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_14fasttext_inner_ONEF), (&(__pyx_v_syn0_vocab[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":216 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + * for d in range(subwords_idx_len[m]): # <<<<<<<<<<<<<< + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + */ + __pyx_t_4 = (__pyx_v_subwords_idx_len[__pyx_v_m]); + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_d = __pyx_t_5; + + /* "gensim/models/fasttext_inner.pyx":217 + * our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + * for d in range(subwords_idx_len[m]): + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + * if count > (0.5): + */ + __pyx_v_count = (__pyx_v_count + __pyx_v_6gensim_6models_14fasttext_inner_ONEF); + + /* "gensim/models/fasttext_inner.pyx":218 + * for d in range(subwords_idx_len[m]): + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * if count > (0.5): + * inv_count = ONEF / count + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_14fasttext_inner_ONEF), (&(__pyx_v_syn0_ngrams[(((__pyx_v_subwords_idx[__pyx_v_m])[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + __pyx_L3_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":219 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF / count + * if cbow_mean: + */ + __pyx_t_3 = ((__pyx_v_count > ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":220 + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + * if count > (0.5): + * inv_count = ONEF / count # <<<<<<<<<<<<<< + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) + */ + __pyx_v_inv_count = (__pyx_v_6gensim_6models_14fasttext_inner_ONEF / __pyx_v_count); + + /* "gensim/models/fasttext_inner.pyx":219 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF / count + * if cbow_mean: + */ + } + + /* "gensim/models/fasttext_inner.pyx":221 + * if count > (0.5): + * inv_count = ONEF / count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) + * + */ + __pyx_t_3 = (__pyx_v_cbow_mean != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":222 + * inv_count = ONEF / count + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # <<<<<<<<<<<<<< + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + */ + __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":221 + * if count > (0.5): + * inv_count = ONEF / count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":224 + * sscal(&size, &inv_count, neu1, &ONE) + * + * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * for b in range(codelens[i]): + * row2 = word_point[b] * size + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); + + /* "gensim/models/fasttext_inner.pyx":225 + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelens[i]): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f_dot = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + */ + __pyx_t_1 = (__pyx_v_codelens[__pyx_v_i]); + for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_1; __pyx_t_6+=1) { + __pyx_v_b = __pyx_t_6; + + /* "gensim/models/fasttext_inner.pyx":226 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelens[i]): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f_dot = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "gensim/models/fasttext_inner.pyx":227 + * for b in range(codelens[i]): + * row2 = word_point[b] * size + * f_dot = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + */ + __pyx_v_f_dot = __pyx_v_6gensim_6models_14word2vec_inner_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":228 + * row2 = word_point[b] * size + * f_dot = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_7 = ((__pyx_v_f_dot <= -6.0) != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_3 = __pyx_t_7; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_7 = ((__pyx_v_f_dot >= 6.0) != 0); + __pyx_t_3 = __pyx_t_7; + __pyx_L13_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":229 + * f_dot = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha + */ + goto __pyx_L10_continue; + + /* "gensim/models/fasttext_inner.pyx":228 + * row2 = word_point[b] * size + * f_dot = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/fasttext_inner.pyx":230 + * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * g = (1 - word_code[b] - f) * alpha + * + */ + __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); + + /* "gensim/models/fasttext_inner.pyx":231 + * continue + * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha # <<<<<<<<<<<<<< + * + * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) + */ + __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/fasttext_inner.pyx":233 + * g = (1 - word_code[b] - f) * alpha + * + * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< + * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) + * + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":234 + * + * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) + * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * + * if not cbow_mean: # divide error over summed window vectors + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + __pyx_L10_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":236 + * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) + * + * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, work, &ONE) + * + */ + __pyx_t_3 = ((!(__pyx_v_cbow_mean != 0)) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":237 + * + * if not cbow_mean: # divide error over summed window vectors + * sscal(&size, &inv_count, work, &ONE) # <<<<<<<<<<<<<< + * + * for m in range(j,k): + */ + __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":236 + * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) + * + * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, work, &ONE) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":239 + * sscal(&size, &inv_count, work, &ONE) + * + * for m in range(j,k): # <<<<<<<<<<<<<< + * if m == i: + * continue + */ + __pyx_t_1 = __pyx_v_k; + for (__pyx_t_2 = __pyx_v_j; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_m = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":240 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/fasttext_inner.pyx":241 + * for m in range(j,k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + * for d in range(subwords_idx_len[m]): + */ + goto __pyx_L16_continue; + + /* "gensim/models/fasttext_inner.pyx":240 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + */ + } + + /* "gensim/models/fasttext_inner.pyx":242 + * if m == i: + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) # <<<<<<<<<<<<<< + * for d in range(subwords_idx_len[m]): + * our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_vocab[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_vocab[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":243 + * continue + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + * for d in range(subwords_idx_len[m]): # <<<<<<<<<<<<<< + * our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) + * + */ + __pyx_t_4 = (__pyx_v_subwords_idx_len[__pyx_v_m]); + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_d = __pyx_t_5; + + /* "gensim/models/fasttext_inner.pyx":244 + * our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + * for d in range(subwords_idx_len[m]): + * our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks_ngrams[((__pyx_v_subwords_idx[__pyx_v_m])[__pyx_v_d])])), __pyx_v_work, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), (&(__pyx_v_syn0_ngrams[(((__pyx_v_subwords_idx[__pyx_v_m])[__pyx_v_d]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + } + __pyx_L16_continue:; + } + + /* "gensim/models/fasttext_inner.pyx":197 + * + * + * cdef void fast_sentence_cbow_hs( # <<<<<<<<<<<<<< + * const np.uint32_t *word_point, const np.uint8_t *word_code, int codelens[MAX_SENTENCE_LEN], + * REAL_t *neu1, REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1, const int size, + */ + + /* function exit code */ +} + +/* "gensim/models/fasttext_inner.pyx":247 + * + * + * def train_batch_sg(model, sentences, alpha, _work, _l1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6gensim_6models_14fasttext_inner_1train_batch_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6gensim_6models_14fasttext_inner_1train_batch_sg = {"train_batch_sg", (PyCFunction)__pyx_pw_6gensim_6models_14fasttext_inner_1train_batch_sg, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6gensim_6models_14fasttext_inner_1train_batch_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_model = 0; + PyObject *__pyx_v_sentences = 0; + PyObject *__pyx_v_alpha = 0; + PyObject *__pyx_v__work = 0; + PyObject *__pyx_v__l1 = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("train_batch_sg (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_model,&__pyx_n_s_sentences,&__pyx_n_s_alpha,&__pyx_n_s_work,&__pyx_n_s_l1,0}; + PyObject* values[5] = {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 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_model)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sentences)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_sg", 1, 5, 5, 1); __PYX_ERR(0, 247, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_alpha)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_sg", 1, 5, 5, 2); __PYX_ERR(0, 247, __pyx_L3_error) + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_work)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_sg", 1, 5, 5, 3); __PYX_ERR(0, 247, __pyx_L3_error) + } + case 4: + if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_l1)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_sg", 1, 5, 5, 4); __PYX_ERR(0, 247, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "train_batch_sg") < 0)) __PYX_ERR(0, 247, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentences = values[1]; + __pyx_v_alpha = values[2]; + __pyx_v__work = values[3]; + __pyx_v__l1 = values[4]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("train_batch_sg", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 247, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("gensim.models.fasttext_inner.train_batch_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6gensim_6models_14fasttext_inner_train_batch_sg(__pyx_self, __pyx_v_model, __pyx_v_sentences, __pyx_v_alpha, __pyx_v__work, __pyx_v__l1); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6gensim_6models_14fasttext_inner_train_batch_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work, PyObject *__pyx_v__l1) { + int __pyx_v_hs; + int __pyx_v_negative; + int __pyx_v_sample; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_vocab; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_vocab; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_ngrams; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_ngrams; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_work; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_l1; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v__alpha; + int __pyx_v_size; + int __pyx_v_codelens[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_indexes[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_reduced_windows[0x2710]; + int __pyx_v_sentence_idx[(0x2710 + 1)]; + int __pyx_v_window; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_effective_words; + int __pyx_v_effective_sentences; + int __pyx_v_sent_idx; + int __pyx_v_idx_start; + int __pyx_v_idx_end; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1; + __pyx_t_5numpy_uint32_t *__pyx_v_points[0x2710]; + __pyx_t_5numpy_uint8_t *__pyx_v_codes[0x2710]; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1neg; + __pyx_t_5numpy_uint32_t *__pyx_v_cum_table; + unsigned PY_LONG_LONG __pyx_v_cum_table_len; + unsigned PY_LONG_LONG __pyx_v_next_random; + int __pyx_v_subwords_idx_len[0x2710]; + __pyx_t_5numpy_uint32_t *__pyx_v_subwords_idx[0x2710]; + PyObject *__pyx_v_subword_arrays = NULL; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_sent = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + PyObject *__pyx_v_subwords = NULL; + PyObject *__pyx_v_word_subwords = NULL; + PyObject *__pyx_v_item = NULL; + PyObject *__pyx_v_subword_i = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + unsigned PY_LONG_LONG __pyx_t_9; + PyObject *(*__pyx_t_10)(PyObject *); + Py_ssize_t __pyx_t_11; + PyObject *(*__pyx_t_12)(PyObject *); + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + __pyx_t_5numpy_uint32_t __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + PyObject *(*__pyx_t_19)(PyObject *); + int __pyx_t_20; + int __pyx_t_21; + int __pyx_t_22; + int __pyx_t_23; + int __pyx_t_24; + __Pyx_RefNannySetupContext("train_batch_sg", 0); + + /* "gensim/models/fasttext_inner.pyx":248 + * + * def train_batch_sg(model, sentences, alpha, _work, _l1): + * cdef int hs = model.hs # <<<<<<<<<<<<<< + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_hs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 248, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_hs = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":249 + * def train_batch_sg(model, sentences, alpha, _work, _l1): + * cdef int hs = model.hs + * cdef int negative = model.negative # <<<<<<<<<<<<<< + * cdef int sample = (model.sample != 0) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_negative); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 249, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_negative = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":250 + * cdef int hs = model.hs + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_sample); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 250, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_int_0, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 250, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 250, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sample = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":252 + * cdef int sample = (model.sample != 0) + * + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 252, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_syn0_vocab); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 252, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 252, __pyx_L1_error) + __pyx_v_syn0_vocab = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":253 + * + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) # <<<<<<<<<<<<<< + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + * cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_vocab_lockf); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 253, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 253, __pyx_L1_error) + __pyx_v_word_locks_vocab = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":254 + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_syn0_ngrams); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 254, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 254, __pyx_L1_error) + __pyx_v_syn0_ngrams = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":255 + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + * cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) # <<<<<<<<<<<<<< + * + * cdef REAL_t *work + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_ngrams_lockf); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 255, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 255, __pyx_L1_error) + __pyx_v_word_locks_ngrams = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":260 + * cdef REAL_t *l1 + * + * cdef REAL_t _alpha = alpha # <<<<<<<<<<<<<< + * cdef int size = model.layer1_size + * + */ + __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_v_alpha); if (unlikely((__pyx_t_4 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 260, __pyx_L1_error) + __pyx_v__alpha = __pyx_t_4; + + /* "gensim/models/fasttext_inner.pyx":261 + * + * cdef REAL_t _alpha = alpha + * cdef int size = model.layer1_size # <<<<<<<<<<<<<< + * + * cdef int codelens[MAX_SENTENCE_LEN] + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 261, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 261, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_size = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":267 + * cdef np.uint32_t reduced_windows[MAX_SENTENCE_LEN] + * cdef int sentence_idx[MAX_SENTENCE_LEN + 1] + * cdef int window = model.window # <<<<<<<<<<<<<< + * + * cdef int i, j, k + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_window = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":270 + * + * cdef int i, j, k + * cdef int effective_words = 0, effective_sentences = 0 # <<<<<<<<<<<<<< + * cdef int sent_idx, idx_start, idx_end + * + */ + __pyx_v_effective_words = 0; + __pyx_v_effective_sentences = 0; + + /* "gensim/models/fasttext_inner.pyx":290 + * # dummy dictionary to ensure that the memory locations that subwords_idx point to + * # are referenced throughout so that it isn't put back to free memory pool by Python's memory manager + * subword_arrays = {} # <<<<<<<<<<<<<< + * + * if hs: + */ + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 290, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_subword_arrays = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":292 + * subword_arrays = {} + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":293 + * + * if hs: + * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< + * + * if negative: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 293, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 293, __pyx_L1_error) + __pyx_v_syn1 = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":292 + * subword_arrays = {} + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":295 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":296 + * + * if negative: + * syn1neg = (np.PyArray_DATA(model.syn1neg)) # <<<<<<<<<<<<<< + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1neg); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 296, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_v_syn1neg = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":297 + * if negative: + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) # <<<<<<<<<<<<<< + * cum_table_len = len(model.cum_table) + * if negative or sample: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cum_table); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 297, __pyx_L1_error) + __pyx_v_cum_table = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":298 + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) # <<<<<<<<<<<<<< + * if negative or sample: + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cum_table); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 298, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cum_table_len = __pyx_t_6; + + /* "gensim/models/fasttext_inner.pyx":295 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + } + + /* "gensim/models/fasttext_inner.pyx":299 + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) + * if negative or sample: # <<<<<<<<<<<<<< + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + * + */ + __pyx_t_7 = (__pyx_v_negative != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_5 = __pyx_t_7; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_7 = (__pyx_v_sample != 0); + __pyx_t_5 = __pyx_t_7; + __pyx_L6_bool_binop_done:; + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":300 + * cum_table_len = len(model.cum_table) + * if negative or sample: + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< + * + * # convert Python structures to primitive types, so we can release the GIL + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_randint); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyNumber_Multiply(__pyx_int_16777216, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_randint); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = PyNumber_Add(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_9 = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(__pyx_t_8); if (unlikely((__pyx_t_9 == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_next_random = __pyx_t_9; + + /* "gensim/models/fasttext_inner.pyx":299 + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) + * if negative or sample: # <<<<<<<<<<<<<< + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":303 + * + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< + * l1 = np.PyArray_DATA(_l1) + * + */ + if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 303, __pyx_L1_error) + __pyx_v_work = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "gensim/models/fasttext_inner.pyx":304 + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) + * l1 = np.PyArray_DATA(_l1) # <<<<<<<<<<<<<< + * + * # prepare C structures so we can go "full C" and release the Python GIL + */ + if (!(likely(((__pyx_v__l1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__l1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 304, __pyx_L1_error) + __pyx_v_l1 = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__l1))); + + /* "gensim/models/fasttext_inner.pyx":307 + * + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.wv.vocab # <<<<<<<<<<<<<< + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_vocab); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 307, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_vlookup = __pyx_t_3; + __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":308 + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.wv.vocab + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 # <<<<<<<<<<<<<< + * for sent in sentences: + * if not sent: + */ + (__pyx_v_sentence_idx[0]) = 0; + + /* "gensim/models/fasttext_inner.pyx":309 + * vlookup = model.wv.vocab + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: # <<<<<<<<<<<<<< + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged + */ + if (likely(PyList_CheckExact(__pyx_v_sentences)) || PyTuple_CheckExact(__pyx_v_sentences)) { + __pyx_t_3 = __pyx_v_sentences; __Pyx_INCREF(__pyx_t_3); __pyx_t_6 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_sentences); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 309, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 309, __pyx_L1_error) + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_3, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 309, __pyx_L1_error) + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_3, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 309, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_10(__pyx_t_3); + if (unlikely(!__pyx_t_8)) { + 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, 309, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_sent, __pyx_t_8); + __pyx_t_8 = 0; + + /* "gensim/models/fasttext_inner.pyx":310 + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: + * if not sent: # <<<<<<<<<<<<<< + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: + */ + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_sent); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 310, __pyx_L1_error) + __pyx_t_7 = ((!__pyx_t_5) != 0); + if (__pyx_t_7) { + + /* "gensim/models/fasttext_inner.pyx":311 + * for sent in sentences: + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged # <<<<<<<<<<<<<< + * for token in sent: + * word = vlookup[token] if token in vlookup else None + */ + goto __pyx_L8_continue; + + /* "gensim/models/fasttext_inner.pyx":310 + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: + * if not sent: # <<<<<<<<<<<<<< + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: + */ + } + + /* "gensim/models/fasttext_inner.pyx":312 + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + if (likely(PyList_CheckExact(__pyx_v_sent)) || PyTuple_CheckExact(__pyx_v_sent)) { + __pyx_t_8 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_8); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + } else { + __pyx_t_11 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 312, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_12 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 312, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_12)) { + if (likely(PyList_CheckExact(__pyx_t_8))) { + if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) __PYX_ERR(0, 312, __pyx_L1_error) + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_8, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 312, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) __PYX_ERR(0, 312, __pyx_L1_error) + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_8, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 312, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_12(__pyx_t_8); + if (unlikely(!__pyx_t_1)) { + 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, 312, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_1); + __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":313 + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: + * word = vlookup[token] if token in vlookup else None # <<<<<<<<<<<<<< + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + */ + __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_v_token, __pyx_v_vlookup, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 313, __pyx_L1_error) + if ((__pyx_t_7 != 0)) { + __pyx_t_13 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 313, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_1 = __pyx_t_13; + __pyx_t_13 = 0; + } else { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } + __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_1); + __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":314 + * for token in sent: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): + */ + __pyx_t_7 = (__pyx_v_word == Py_None); + __pyx_t_5 = (__pyx_t_7 != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":315 + * word = vlookup[token] if token in vlookup else None + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window # <<<<<<<<<<<<<< + * if sample and word.sample_int < random_int32(&next_random): + * continue + */ + goto __pyx_L11_continue; + + /* "gensim/models/fasttext_inner.pyx":314 + * for token in sent: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): + */ + } + + /* "gensim/models/fasttext_inner.pyx":316 + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): # <<<<<<<<<<<<<< + * continue + * indexes[effective_words] = word.index + */ + __pyx_t_7 = (__pyx_v_sample != 0); + if (__pyx_t_7) { + } else { + __pyx_t_5 = __pyx_t_7; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_sample_int); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 316, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = __Pyx_PyInt_From_unsigned_PY_LONG_LONG(__pyx_f_6gensim_6models_14word2vec_inner_random_int32((&__pyx_v_next_random))); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 316, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_14 = PyObject_RichCompare(__pyx_t_1, __pyx_t_13, Py_LT); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 316, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 316, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_5 = __pyx_t_7; + __pyx_L15_bool_binop_done:; + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":317 + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): + * continue # <<<<<<<<<<<<<< + * indexes[effective_words] = word.index + * + */ + goto __pyx_L11_continue; + + /* "gensim/models/fasttext_inner.pyx":316 + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): # <<<<<<<<<<<<<< + * continue + * indexes[effective_words] = word.index + */ + } + + /* "gensim/models/fasttext_inner.pyx":318 + * if sample and word.sample_int < random_int32(&next_random): + * continue + * indexes[effective_words] = word.index # <<<<<<<<<<<<<< + * + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + */ + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 318, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = __Pyx_PyInt_As_npy_uint32(__pyx_t_14); if (unlikely((__pyx_t_15 == ((npy_uint32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 318, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_indexes[__pyx_v_effective_words]) = __pyx_t_15; + + /* "gensim/models/fasttext_inner.pyx":320 + * indexes[effective_words] = word.index + * + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] # <<<<<<<<<<<<<< + * word_subwords = np.array([word.index] + subwords, dtype=np.uint32) + * subwords_idx_len[effective_words] = (len(subwords) + 1) + */ + __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_ngrams_word); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_index2word); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_17 = PyObject_GetItem(__pyx_t_16, __pyx_t_13); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = PyObject_GetItem(__pyx_t_1, __pyx_t_17); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + if (likely(PyList_CheckExact(__pyx_t_13)) || PyTuple_CheckExact(__pyx_t_13)) { + __pyx_t_17 = __pyx_t_13; __Pyx_INCREF(__pyx_t_17); __pyx_t_18 = 0; + __pyx_t_19 = NULL; + } else { + __pyx_t_18 = -1; __pyx_t_17 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __pyx_t_19 = Py_TYPE(__pyx_t_17)->tp_iternext; if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 320, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + for (;;) { + if (likely(!__pyx_t_19)) { + if (likely(PyList_CheckExact(__pyx_t_17))) { + if (__pyx_t_18 >= PyList_GET_SIZE(__pyx_t_17)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_13 = PyList_GET_ITEM(__pyx_t_17, __pyx_t_18); __Pyx_INCREF(__pyx_t_13); __pyx_t_18++; if (unlikely(0 < 0)) __PYX_ERR(0, 320, __pyx_L1_error) + #else + __pyx_t_13 = PySequence_ITEM(__pyx_t_17, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + #endif + } else { + if (__pyx_t_18 >= PyTuple_GET_SIZE(__pyx_t_17)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_13 = PyTuple_GET_ITEM(__pyx_t_17, __pyx_t_18); __Pyx_INCREF(__pyx_t_13); __pyx_t_18++; if (unlikely(0 < 0)) __PYX_ERR(0, 320, __pyx_L1_error) + #else + __pyx_t_13 = PySequence_ITEM(__pyx_t_17, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + #endif + } + } else { + __pyx_t_13 = __pyx_t_19(__pyx_t_17); + if (unlikely(!__pyx_t_13)) { + 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, 320, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_13); + } + __Pyx_XDECREF_SET(__pyx_v_subword_i, __pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_ngrams); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = PyObject_GetItem(__pyx_t_1, __pyx_v_subword_i); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__Pyx_ListComp_Append(__pyx_t_14, (PyObject*)__pyx_t_13))) __PYX_ERR(0, 320, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_XDECREF_SET(__pyx_v_subwords, ((PyObject*)__pyx_t_14)); + __pyx_t_14 = 0; + + /* "gensim/models/fasttext_inner.pyx":321 + * + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + * word_subwords = np.array([word.index] + subwords, dtype=np.uint32) # <<<<<<<<<<<<<< + * subwords_idx_len[effective_words] = (len(subwords) + 1) + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + */ + __pyx_t_14 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_14, __pyx_n_s_array); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_13 = PyList_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_14); + PyList_SET_ITEM(__pyx_t_13, 0, __pyx_t_14); + __pyx_t_14 = 0; + __pyx_t_14 = PyNumber_Add(__pyx_t_13, __pyx_v_subwords); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_14); + PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_14); + __pyx_t_14 = 0; + __pyx_t_14 = PyDict_New(); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (PyDict_SetItem(__pyx_t_14, __pyx_n_s_dtype, __pyx_t_16) < 0) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_17, __pyx_t_13, __pyx_t_14); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 321, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF_SET(__pyx_v_word_subwords, __pyx_t_16); + __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":322 + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + * word_subwords = np.array([word.index] + subwords, dtype=np.uint32) + * subwords_idx_len[effective_words] = (len(subwords) + 1) # <<<<<<<<<<<<<< + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + * # ensures reference count of word_subwords doesn't reach 0 + */ + __pyx_t_18 = PyList_GET_SIZE(__pyx_v_subwords); if (unlikely(__pyx_t_18 == -1)) __PYX_ERR(0, 322, __pyx_L1_error) + (__pyx_v_subwords_idx_len[__pyx_v_effective_words]) = ((int)(__pyx_t_18 + 1)); + + /* "gensim/models/fasttext_inner.pyx":323 + * word_subwords = np.array([word.index] + subwords, dtype=np.uint32) + * subwords_idx_len[effective_words] = (len(subwords) + 1) + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) # <<<<<<<<<<<<<< + * # ensures reference count of word_subwords doesn't reach 0 + * subword_arrays[effective_words] = word_subwords + */ + if (!(likely(((__pyx_v_word_subwords) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_word_subwords, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 323, __pyx_L1_error) + (__pyx_v_subwords_idx[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_v_word_subwords))); + + /* "gensim/models/fasttext_inner.pyx":325 + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + * # ensures reference count of word_subwords doesn't reach 0 + * subword_arrays[effective_words] = word_subwords # <<<<<<<<<<<<<< + * + * if hs: + */ + __pyx_t_16 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 325, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + if (unlikely(PyDict_SetItem(__pyx_v_subword_arrays, __pyx_t_16, __pyx_v_word_subwords) < 0)) __PYX_ERR(0, 325, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":327 + * subword_arrays[effective_words] = word_subwords + * + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":328 + * + * if hs: + * codelens[effective_words] = len(word.code) # <<<<<<<<<<<<<< + * codes[effective_words] = np.PyArray_DATA(word.code) + * points[effective_words] = np.PyArray_DATA(word.point) + */ + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 328, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_18 = PyObject_Length(__pyx_t_16); if (unlikely(__pyx_t_18 == -1)) __PYX_ERR(0, 328, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + (__pyx_v_codelens[__pyx_v_effective_words]) = ((int)__pyx_t_18); + + /* "gensim/models/fasttext_inner.pyx":329 + * if hs: + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) # <<<<<<<<<<<<<< + * points[effective_words] = np.PyArray_DATA(word.point) + * + */ + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 329, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + if (!(likely(((__pyx_t_16) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_16, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 329, __pyx_L1_error) + (__pyx_v_codes[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_16))); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":330 + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + * points[effective_words] = np.PyArray_DATA(word.point) # <<<<<<<<<<<<<< + * + * effective_words += 1 + */ + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 330, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + if (!(likely(((__pyx_t_16) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_16, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 330, __pyx_L1_error) + (__pyx_v_points[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_16))); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":327 + * subword_arrays[effective_words] = word_subwords + * + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + } + + /* "gensim/models/fasttext_inner.pyx":332 + * points[effective_words] = np.PyArray_DATA(word.point) + * + * effective_words += 1 # <<<<<<<<<<<<<< + * if effective_words == MAX_SENTENCE_LEN: + * break + */ + __pyx_v_effective_words = (__pyx_v_effective_words + 1); + + /* "gensim/models/fasttext_inner.pyx":333 + * + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break + * + */ + __pyx_t_5 = ((__pyx_v_effective_words == 0x2710) != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":334 + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: + * break # <<<<<<<<<<<<<< + * + * # keep track of which words go into which sentence, so we don't train + */ + goto __pyx_L12_break; + + /* "gensim/models/fasttext_inner.pyx":333 + * + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":312 + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + __pyx_L11_continue:; + } + __pyx_L12_break:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "gensim/models/fasttext_inner.pyx":339 + * # across sentence boundaries. + * # indices of sentence number X are between tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 346, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_16))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_16)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 346, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_16, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 346, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_16)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 346, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_16, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 346, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_10(__pyx_t_16); + if (unlikely(!__pyx_t_3)) { + 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, 346, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_v_i = __pyx_t_2; + __pyx_t_2 = (__pyx_t_2 + 1); + + /* "gensim/models/fasttext_inner.pyx":347 + * # precompute "reduced window" offsets in a single randint() call + * for i, item in enumerate(model.random.randint(0, window, effective_words)): + * reduced_windows[i] = item # <<<<<<<<<<<<<< + * + * with nogil: + */ + __pyx_t_15 = __Pyx_PyInt_As_npy_uint32(__pyx_v_item); if (unlikely((__pyx_t_15 == ((npy_uint32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 347, __pyx_L1_error) + (__pyx_v_reduced_windows[__pyx_v_i]) = __pyx_t_15; + + /* "gensim/models/fasttext_inner.pyx":346 + * + * # precompute "reduced window" offsets in a single randint() call + * for i, item in enumerate(model.random.randint(0, window, effective_words)): # <<<<<<<<<<<<<< + * reduced_windows[i] = item + * + */ + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":349 + * reduced_windows[i] = item + * + * with nogil: # <<<<<<<<<<<<<< + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + #endif + /*try:*/ { + + /* "gensim/models/fasttext_inner.pyx":350 + * + * with nogil: + * for sent_idx in range(effective_sentences): # <<<<<<<<<<<<<< + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + */ + __pyx_t_2 = __pyx_v_effective_sentences; + for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_2; __pyx_t_20+=1) { + __pyx_v_sent_idx = __pyx_t_20; + + /* "gensim/models/fasttext_inner.pyx":351 + * with nogil: + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] # <<<<<<<<<<<<<< + * idx_end = sentence_idx[sent_idx + 1] + * for i in range(idx_start, idx_end): + */ + __pyx_v_idx_start = (__pyx_v_sentence_idx[__pyx_v_sent_idx]); + + /* "gensim/models/fasttext_inner.pyx":352 + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] # <<<<<<<<<<<<<< + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + */ + __pyx_v_idx_end = (__pyx_v_sentence_idx[(__pyx_v_sent_idx + 1)]); + + /* "gensim/models/fasttext_inner.pyx":353 + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + * for i in range(idx_start, idx_end): # <<<<<<<<<<<<<< + * j = i - window + reduced_windows[i] + * if j < idx_start: + */ + __pyx_t_21 = __pyx_v_idx_end; + for (__pyx_t_22 = __pyx_v_idx_start; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) { + __pyx_v_i = __pyx_t_22; + + /* "gensim/models/fasttext_inner.pyx":354 + * idx_end = sentence_idx[sent_idx + 1] + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] # <<<<<<<<<<<<<< + * if j < idx_start: + * j = idx_start + */ + __pyx_v_j = ((__pyx_v_i - __pyx_v_window) + (__pyx_v_reduced_windows[__pyx_v_i])); + + /* "gensim/models/fasttext_inner.pyx":355 + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + * if j < idx_start: # <<<<<<<<<<<<<< + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + */ + __pyx_t_5 = ((__pyx_v_j < __pyx_v_idx_start) != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":356 + * j = i - window + reduced_windows[i] + * if j < idx_start: + * j = idx_start # <<<<<<<<<<<<<< + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: + */ + __pyx_v_j = __pyx_v_idx_start; + + /* "gensim/models/fasttext_inner.pyx":355 + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + * if j < idx_start: # <<<<<<<<<<<<<< + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + */ + } + + /* "gensim/models/fasttext_inner.pyx":357 + * if j < idx_start: + * j = idx_start + * k = i + window + 1 - reduced_windows[i] # <<<<<<<<<<<<<< + * if k > idx_end: + * k = idx_end + */ + __pyx_v_k = (((__pyx_v_i + __pyx_v_window) + 1) - (__pyx_v_reduced_windows[__pyx_v_i])); + + /* "gensim/models/fasttext_inner.pyx":358 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * for j in range(j, k): + */ + __pyx_t_5 = ((__pyx_v_k > __pyx_v_idx_end) != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":359 + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: + * k = idx_end # <<<<<<<<<<<<<< + * for j in range(j, k): + * if j == i: + */ + __pyx_v_k = __pyx_v_idx_end; + + /* "gensim/models/fasttext_inner.pyx":358 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * for j in range(j, k): + */ + } + + /* "gensim/models/fasttext_inner.pyx":360 + * if k > idx_end: + * k = idx_end + * for j in range(j, k): # <<<<<<<<<<<<<< + * if j == i: + * continue + */ + __pyx_t_23 = __pyx_v_k; + for (__pyx_t_24 = __pyx_v_j; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) { + __pyx_v_j = __pyx_t_24; + + /* "gensim/models/fasttext_inner.pyx":361 + * k = idx_end + * for j in range(j, k): + * if j == i: # <<<<<<<<<<<<<< + * continue + * if hs: + */ + __pyx_t_5 = ((__pyx_v_j == __pyx_v_i) != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":362 + * for j in range(j, k): + * if j == i: + * continue # <<<<<<<<<<<<<< + * if hs: + * fast_sentence_sg_hs( + */ + goto __pyx_L33_continue; + + /* "gensim/models/fasttext_inner.pyx":361 + * k = idx_end + * for j in range(j, k): + * if j == i: # <<<<<<<<<<<<<< + * continue + * if hs: + */ + } + + /* "gensim/models/fasttext_inner.pyx":363 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs( + * points[j], codes[j], codelens[j], syn0_vocab, syn0_ngrams, syn1, size, + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":364 + * continue + * if hs: + * fast_sentence_sg_hs( # <<<<<<<<<<<<<< + * points[j], codes[j], codelens[j], syn0_vocab, syn0_ngrams, syn1, size, + * subwords_idx[i], subwords_idx_len[i], _alpha, work, l1, word_locks_vocab, + */ + __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_sg_hs((__pyx_v_points[__pyx_v_j]), (__pyx_v_codes[__pyx_v_j]), (__pyx_v_codelens[__pyx_v_j]), __pyx_v_syn0_vocab, __pyx_v_syn0_ngrams, __pyx_v_syn1, __pyx_v_size, (__pyx_v_subwords_idx[__pyx_v_i]), (__pyx_v_subwords_idx_len[__pyx_v_i]), __pyx_v__alpha, __pyx_v_work, __pyx_v_l1, __pyx_v_word_locks_vocab, __pyx_v_word_locks_ngrams); + + /* "gensim/models/fasttext_inner.pyx":363 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs( + * points[j], codes[j], codelens[j], syn0_vocab, syn0_ngrams, syn1, size, + */ + } + + /* "gensim/models/fasttext_inner.pyx":368 + * subwords_idx[i], subwords_idx_len[i], _alpha, work, l1, word_locks_vocab, + * word_locks_ngrams) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg( + * negative, cum_table, cum_table_len, syn0_vocab, syn0_ngrams, syn1neg, size, + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":369 + * word_locks_ngrams) + * if negative: + * next_random = fast_sentence_sg_neg( # <<<<<<<<<<<<<< + * negative, cum_table, cum_table_len, syn0_vocab, syn0_ngrams, syn1neg, size, + * indexes[j], subwords_idx[i], subwords_idx_len[i], _alpha, work, l1, + */ + __pyx_v_next_random = __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_sg_neg(__pyx_v_negative, __pyx_v_cum_table, __pyx_v_cum_table_len, __pyx_v_syn0_vocab, __pyx_v_syn0_ngrams, __pyx_v_syn1neg, __pyx_v_size, (__pyx_v_indexes[__pyx_v_j]), (__pyx_v_subwords_idx[__pyx_v_i]), (__pyx_v_subwords_idx_len[__pyx_v_i]), __pyx_v__alpha, __pyx_v_work, __pyx_v_l1, __pyx_v_next_random, __pyx_v_word_locks_vocab, __pyx_v_word_locks_ngrams); + + /* "gensim/models/fasttext_inner.pyx":368 + * subwords_idx[i], subwords_idx_len[i], _alpha, work, l1, word_locks_vocab, + * word_locks_ngrams) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg( + * negative, cum_table, cum_table_len, syn0_vocab, syn0_ngrams, syn1neg, size, + */ + } + __pyx_L33_continue:; + } + } + } + } + + /* "gensim/models/fasttext_inner.pyx":349 + * reduced_windows[i] = item + * + * with nogil: # <<<<<<<<<<<<<< + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + Py_BLOCK_THREADS + #endif + goto __pyx_L26; + } + __pyx_L26:; + } + } + + /* "gensim/models/fasttext_inner.pyx":374 + * next_random, word_locks_vocab, word_locks_ngrams) + * + * return effective_words # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_16 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 374, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_r = __pyx_t_16; + __pyx_t_16 = 0; + goto __pyx_L0; + + /* "gensim/models/fasttext_inner.pyx":247 + * + * + * def train_batch_sg(model, sentences, alpha, _work, _l1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("gensim.models.fasttext_inner.train_batch_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_subword_arrays); + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_sent); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XDECREF(__pyx_v_subwords); + __Pyx_XDECREF(__pyx_v_word_subwords); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XDECREF(__pyx_v_subword_i); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "gensim/models/fasttext_inner.pyx":377 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6gensim_6models_14fasttext_inner_3train_batch_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6gensim_6models_14fasttext_inner_3train_batch_cbow = {"train_batch_cbow", (PyCFunction)__pyx_pw_6gensim_6models_14fasttext_inner_3train_batch_cbow, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6gensim_6models_14fasttext_inner_3train_batch_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_model = 0; + PyObject *__pyx_v_sentences = 0; + PyObject *__pyx_v_alpha = 0; + PyObject *__pyx_v__work = 0; + PyObject *__pyx_v__neu1 = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("train_batch_cbow (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_model,&__pyx_n_s_sentences,&__pyx_n_s_alpha,&__pyx_n_s_work,&__pyx_n_s_neu1,0}; + PyObject* values[5] = {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 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_model)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sentences)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_cbow", 1, 5, 5, 1); __PYX_ERR(0, 377, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_alpha)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_cbow", 1, 5, 5, 2); __PYX_ERR(0, 377, __pyx_L3_error) + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_work)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_cbow", 1, 5, 5, 3); __PYX_ERR(0, 377, __pyx_L3_error) + } + case 4: + if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_neu1)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("train_batch_cbow", 1, 5, 5, 4); __PYX_ERR(0, 377, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "train_batch_cbow") < 0)) __PYX_ERR(0, 377, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentences = values[1]; + __pyx_v_alpha = values[2]; + __pyx_v__work = values[3]; + __pyx_v__neu1 = values[4]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("train_batch_cbow", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 377, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("gensim.models.fasttext_inner.train_batch_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6gensim_6models_14fasttext_inner_2train_batch_cbow(__pyx_self, __pyx_v_model, __pyx_v_sentences, __pyx_v_alpha, __pyx_v__work, __pyx_v__neu1); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6gensim_6models_14fasttext_inner_2train_batch_cbow(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work, PyObject *__pyx_v__neu1) { + int __pyx_v_hs; + int __pyx_v_negative; + int __pyx_v_sample; + int __pyx_v_cbow_mean; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_vocab; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_vocab; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn0_ngrams; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_word_locks_ngrams; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_work; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_v__alpha; + int __pyx_v_size; + int __pyx_v_codelens[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_indexes[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_reduced_windows[0x2710]; + int __pyx_v_sentence_idx[(0x2710 + 1)]; + int __pyx_v_window; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + int __pyx_v_effective_words; + int __pyx_v_effective_sentences; + int __pyx_v_sent_idx; + int __pyx_v_idx_start; + int __pyx_v_idx_end; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1; + __pyx_t_5numpy_uint32_t *__pyx_v_points[0x2710]; + __pyx_t_5numpy_uint8_t *__pyx_v_codes[0x2710]; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_syn1neg; + __pyx_t_5numpy_uint32_t *__pyx_v_cum_table; + unsigned PY_LONG_LONG __pyx_v_cum_table_len; + unsigned PY_LONG_LONG __pyx_v_next_random; + int __pyx_v_subwords_idx_len[0x2710]; + __pyx_t_5numpy_uint32_t *__pyx_v_subwords_idx[0x2710]; + PyObject *__pyx_v_subword_arrays = NULL; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t *__pyx_v_neu1; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_sent = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + PyObject *__pyx_v_subwords = NULL; + PyObject *__pyx_v_word_subwords = NULL; + PyObject *__pyx_v_item = NULL; + PyObject *__pyx_v_subword_i = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_t_4; + int __pyx_t_5; + Py_ssize_t __pyx_t_6; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + unsigned PY_LONG_LONG __pyx_t_9; + PyObject *(*__pyx_t_10)(PyObject *); + Py_ssize_t __pyx_t_11; + PyObject *(*__pyx_t_12)(PyObject *); + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + __pyx_t_5numpy_uint32_t __pyx_t_15; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + Py_ssize_t __pyx_t_18; + PyObject *(*__pyx_t_19)(PyObject *); + int __pyx_t_20; + int __pyx_t_21; + int __pyx_t_22; + __Pyx_RefNannySetupContext("train_batch_cbow", 0); + + /* "gensim/models/fasttext_inner.pyx":378 + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): + * cdef int hs = model.hs # <<<<<<<<<<<<<< + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_hs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 378, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 378, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_hs = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":379 + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): + * cdef int hs = model.hs + * cdef int negative = model.negative # <<<<<<<<<<<<<< + * cdef int sample = (model.sample != 0) + * cdef int cbow_mean = model.cbow_mean + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_negative); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 379, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_negative = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":380 + * cdef int hs = model.hs + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) # <<<<<<<<<<<<<< + * cdef int cbow_mean = model.cbow_mean + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_sample); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 380, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_int_0, Py_NE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 380, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 380, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sample = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":381 + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) + * cdef int cbow_mean = model.cbow_mean # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cbow_mean); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cbow_mean = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":383 + * cdef int cbow_mean = model.cbow_mean + * + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_syn0_vocab); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 383, __pyx_L1_error) + __pyx_v_syn0_vocab = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":384 + * + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) # <<<<<<<<<<<<<< + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + * cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_vocab_lockf); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 384, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 384, __pyx_L1_error) + __pyx_v_word_locks_vocab = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":385 + * cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 385, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_syn0_ngrams); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 385, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 385, __pyx_L1_error) + __pyx_v_syn0_ngrams = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":386 + * cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + * cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + * cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) # <<<<<<<<<<<<<< + * + * cdef REAL_t *work + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_ngrams_lockf); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 386, __pyx_L1_error) + __pyx_v_word_locks_ngrams = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":389 + * + * cdef REAL_t *work + * cdef REAL_t _alpha = alpha # <<<<<<<<<<<<<< + * cdef int size = model.layer1_size + * + */ + __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_v_alpha); if (unlikely((__pyx_t_4 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 389, __pyx_L1_error) + __pyx_v__alpha = __pyx_t_4; + + /* "gensim/models/fasttext_inner.pyx":390 + * cdef REAL_t *work + * cdef REAL_t _alpha = alpha + * cdef int size = model.layer1_size # <<<<<<<<<<<<<< + * + * cdef int codelens[MAX_SENTENCE_LEN] + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 390, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 390, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_size = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":396 + * cdef np.uint32_t reduced_windows[MAX_SENTENCE_LEN] + * cdef int sentence_idx[MAX_SENTENCE_LEN + 1] + * cdef int window = model.window # <<<<<<<<<<<<<< + * + * cdef int i, j, k + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 396, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 396, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_window = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":399 + * + * cdef int i, j, k + * cdef int effective_words = 0, effective_sentences = 0 # <<<<<<<<<<<<<< + * cdef int sent_idx, idx_start, idx_end + * + */ + __pyx_v_effective_words = 0; + __pyx_v_effective_sentences = 0; + + /* "gensim/models/fasttext_inner.pyx":419 + * # dummy dictionary to ensure that the memory locations that subwords_idx point to + * # are referenced throughout so that it isn't put back to free memory pool by Python's memory manager + * subword_arrays = {} # <<<<<<<<<<<<<< + * + * if hs: + */ + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 419, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_subword_arrays = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":421 + * subword_arrays = {} + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":422 + * + * if hs: + * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< + * + * if negative: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 422, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 422, __pyx_L1_error) + __pyx_v_syn1 = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":421 + * subword_arrays = {} + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":424 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":425 + * + * if negative: + * syn1neg = (np.PyArray_DATA(model.syn1neg)) # <<<<<<<<<<<<<< + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1neg); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 425, __pyx_L1_error) + __pyx_v_syn1neg = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":426 + * if negative: + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) # <<<<<<<<<<<<<< + * cum_table_len = len(model.cum_table) + * if negative or sample: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cum_table); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 426, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 426, __pyx_L1_error) + __pyx_v_cum_table = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":427 + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) # <<<<<<<<<<<<<< + * if negative or sample: + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cum_table); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 427, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cum_table_len = __pyx_t_6; + + /* "gensim/models/fasttext_inner.pyx":424 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + } + + /* "gensim/models/fasttext_inner.pyx":428 + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) + * if negative or sample: # <<<<<<<<<<<<<< + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + * + */ + __pyx_t_7 = (__pyx_v_negative != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_5 = __pyx_t_7; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_7 = (__pyx_v_sample != 0); + __pyx_t_5 = __pyx_t_7; + __pyx_L6_bool_binop_done:; + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":429 + * cum_table_len = len(model.cum_table) + * if negative or sample: + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< + * + * # convert Python structures to primitive types, so we can release the GIL + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_randint); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyNumber_Multiply(__pyx_int_16777216, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_randint); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = PyNumber_Add(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_9 = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(__pyx_t_8); if (unlikely((__pyx_t_9 == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_next_random = __pyx_t_9; + + /* "gensim/models/fasttext_inner.pyx":428 + * cum_table = (np.PyArray_DATA(model.cum_table)) + * cum_table_len = len(model.cum_table) + * if negative or sample: # <<<<<<<<<<<<<< + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":432 + * + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< + * neu1 = np.PyArray_DATA(_neu1) + * + */ + if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 432, __pyx_L1_error) + __pyx_v_work = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "gensim/models/fasttext_inner.pyx":433 + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) + * neu1 = np.PyArray_DATA(_neu1) # <<<<<<<<<<<<<< + * + * # prepare C structures so we can go "full C" and release the Python GIL + */ + if (!(likely(((__pyx_v__neu1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__neu1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 433, __pyx_L1_error) + __pyx_v_neu1 = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__neu1))); + + /* "gensim/models/fasttext_inner.pyx":436 + * + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.wv.vocab # <<<<<<<<<<<<<< + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 436, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_vocab); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 436, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_vlookup = __pyx_t_3; + __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":437 + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.wv.vocab + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 # <<<<<<<<<<<<<< + * for sent in sentences: + * if not sent: + */ + (__pyx_v_sentence_idx[0]) = 0; + + /* "gensim/models/fasttext_inner.pyx":438 + * vlookup = model.wv.vocab + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: # <<<<<<<<<<<<<< + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged + */ + if (likely(PyList_CheckExact(__pyx_v_sentences)) || PyTuple_CheckExact(__pyx_v_sentences)) { + __pyx_t_3 = __pyx_v_sentences; __Pyx_INCREF(__pyx_t_3); __pyx_t_6 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_sentences); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 438, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_10 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 438, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 438, __pyx_L1_error) + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_3, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 438, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 438, __pyx_L1_error) + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_3, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 438, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_10(__pyx_t_3); + if (unlikely(!__pyx_t_8)) { + 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, 438, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_sent, __pyx_t_8); + __pyx_t_8 = 0; + + /* "gensim/models/fasttext_inner.pyx":439 + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: + * if not sent: # <<<<<<<<<<<<<< + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: + */ + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_sent); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 439, __pyx_L1_error) + __pyx_t_7 = ((!__pyx_t_5) != 0); + if (__pyx_t_7) { + + /* "gensim/models/fasttext_inner.pyx":440 + * for sent in sentences: + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged # <<<<<<<<<<<<<< + * for token in sent: + * word = vlookup[token] if token in vlookup else None + */ + goto __pyx_L8_continue; + + /* "gensim/models/fasttext_inner.pyx":439 + * sentence_idx[0] = 0 # indices of the first sentence always start at 0 + * for sent in sentences: + * if not sent: # <<<<<<<<<<<<<< + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: + */ + } + + /* "gensim/models/fasttext_inner.pyx":441 + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + if (likely(PyList_CheckExact(__pyx_v_sent)) || PyTuple_CheckExact(__pyx_v_sent)) { + __pyx_t_8 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_8); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + } else { + __pyx_t_11 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_12 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 441, __pyx_L1_error) + } + for (;;) { + if (likely(!__pyx_t_12)) { + if (likely(PyList_CheckExact(__pyx_t_8))) { + if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) __PYX_ERR(0, 441, __pyx_L1_error) + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_8, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) __PYX_ERR(0, 441, __pyx_L1_error) + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_8, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 441, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_12(__pyx_t_8); + if (unlikely(!__pyx_t_1)) { + 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, 441, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_1); + __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":442 + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: + * word = vlookup[token] if token in vlookup else None # <<<<<<<<<<<<<< + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + */ + __pyx_t_7 = (__Pyx_PySequence_ContainsTF(__pyx_v_token, __pyx_v_vlookup, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 442, __pyx_L1_error) + if ((__pyx_t_7 != 0)) { + __pyx_t_13 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 442, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_1 = __pyx_t_13; + __pyx_t_13 = 0; + } else { + __Pyx_INCREF(Py_None); + __pyx_t_1 = Py_None; + } + __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_1); + __pyx_t_1 = 0; + + /* "gensim/models/fasttext_inner.pyx":443 + * for token in sent: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): + */ + __pyx_t_7 = (__pyx_v_word == Py_None); + __pyx_t_5 = (__pyx_t_7 != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":444 + * word = vlookup[token] if token in vlookup else None + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window # <<<<<<<<<<<<<< + * if sample and word.sample_int < random_int32(&next_random): + * continue + */ + goto __pyx_L11_continue; + + /* "gensim/models/fasttext_inner.pyx":443 + * for token in sent: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): + */ + } + + /* "gensim/models/fasttext_inner.pyx":445 + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): # <<<<<<<<<<<<<< + * continue + * indexes[effective_words] = word.index + */ + __pyx_t_7 = (__pyx_v_sample != 0); + if (__pyx_t_7) { + } else { + __pyx_t_5 = __pyx_t_7; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_sample_int); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 445, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = __Pyx_PyInt_From_unsigned_PY_LONG_LONG(__pyx_f_6gensim_6models_14word2vec_inner_random_int32((&__pyx_v_next_random))); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 445, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_14 = PyObject_RichCompare(__pyx_t_1, __pyx_t_13, Py_LT); __Pyx_XGOTREF(__pyx_t_14); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 445, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_14); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 445, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_5 = __pyx_t_7; + __pyx_L15_bool_binop_done:; + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":446 + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): + * continue # <<<<<<<<<<<<<< + * indexes[effective_words] = word.index + * + */ + goto __pyx_L11_continue; + + /* "gensim/models/fasttext_inner.pyx":445 + * if word is None: + * continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + * if sample and word.sample_int < random_int32(&next_random): # <<<<<<<<<<<<<< + * continue + * indexes[effective_words] = word.index + */ + } + + /* "gensim/models/fasttext_inner.pyx":447 + * if sample and word.sample_int < random_int32(&next_random): + * continue + * indexes[effective_words] = word.index # <<<<<<<<<<<<<< + * + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + */ + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 447, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_15 = __Pyx_PyInt_As_npy_uint32(__pyx_t_14); if (unlikely((__pyx_t_15 == ((npy_uint32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 447, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_indexes[__pyx_v_effective_words]) = __pyx_t_15; + + /* "gensim/models/fasttext_inner.pyx":449 + * indexes[effective_words] = word.index + * + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] # <<<<<<<<<<<<<< + * word_subwords = np.array(subwords, dtype=np.uint32) + * subwords_idx_len[effective_words] = len(subwords) + */ + __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_ngrams_word); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_index2word); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_17 = PyObject_GetItem(__pyx_t_16, __pyx_t_13); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = PyObject_GetItem(__pyx_t_1, __pyx_t_17); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + if (likely(PyList_CheckExact(__pyx_t_13)) || PyTuple_CheckExact(__pyx_t_13)) { + __pyx_t_17 = __pyx_t_13; __Pyx_INCREF(__pyx_t_17); __pyx_t_18 = 0; + __pyx_t_19 = NULL; + } else { + __pyx_t_18 = -1; __pyx_t_17 = PyObject_GetIter(__pyx_t_13); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __pyx_t_19 = Py_TYPE(__pyx_t_17)->tp_iternext; if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 449, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + for (;;) { + if (likely(!__pyx_t_19)) { + if (likely(PyList_CheckExact(__pyx_t_17))) { + if (__pyx_t_18 >= PyList_GET_SIZE(__pyx_t_17)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_13 = PyList_GET_ITEM(__pyx_t_17, __pyx_t_18); __Pyx_INCREF(__pyx_t_13); __pyx_t_18++; if (unlikely(0 < 0)) __PYX_ERR(0, 449, __pyx_L1_error) + #else + __pyx_t_13 = PySequence_ITEM(__pyx_t_17, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + #endif + } else { + if (__pyx_t_18 >= PyTuple_GET_SIZE(__pyx_t_17)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_13 = PyTuple_GET_ITEM(__pyx_t_17, __pyx_t_18); __Pyx_INCREF(__pyx_t_13); __pyx_t_18++; if (unlikely(0 < 0)) __PYX_ERR(0, 449, __pyx_L1_error) + #else + __pyx_t_13 = PySequence_ITEM(__pyx_t_17, __pyx_t_18); __pyx_t_18++; if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + #endif + } + } else { + __pyx_t_13 = __pyx_t_19(__pyx_t_17); + if (unlikely(!__pyx_t_13)) { + 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, 449, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_13); + } + __Pyx_XDECREF_SET(__pyx_v_subword_i, __pyx_t_13); + __pyx_t_13 = 0; + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_wv); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_ngrams); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = PyObject_GetItem(__pyx_t_1, __pyx_v_subword_i); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (unlikely(__Pyx_ListComp_Append(__pyx_t_14, (PyObject*)__pyx_t_13))) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_XDECREF_SET(__pyx_v_subwords, ((PyObject*)__pyx_t_14)); + __pyx_t_14 = 0; + + /* "gensim/models/fasttext_inner.pyx":450 + * + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + * word_subwords = np.array(subwords, dtype=np.uint32) # <<<<<<<<<<<<<< + * subwords_idx_len[effective_words] = len(subwords) + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + */ + __pyx_t_14 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_14, __pyx_n_s_array); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_INCREF(__pyx_v_subwords); + __Pyx_GIVEREF(__pyx_v_subwords); + PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_v_subwords); + __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uint32); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (PyDict_SetItem(__pyx_t_13, __pyx_n_s_dtype, __pyx_t_16) < 0) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + __pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_17, __pyx_t_14, __pyx_t_13); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0; + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_XDECREF_SET(__pyx_v_word_subwords, __pyx_t_16); + __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":451 + * subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + * word_subwords = np.array(subwords, dtype=np.uint32) + * subwords_idx_len[effective_words] = len(subwords) # <<<<<<<<<<<<<< + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + * # ensures reference count of word_subwords doesn't reach 0 + */ + __pyx_t_18 = PyList_GET_SIZE(__pyx_v_subwords); if (unlikely(__pyx_t_18 == -1)) __PYX_ERR(0, 451, __pyx_L1_error) + (__pyx_v_subwords_idx_len[__pyx_v_effective_words]) = ((int)__pyx_t_18); + + /* "gensim/models/fasttext_inner.pyx":452 + * word_subwords = np.array(subwords, dtype=np.uint32) + * subwords_idx_len[effective_words] = len(subwords) + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) # <<<<<<<<<<<<<< + * # ensures reference count of word_subwords doesn't reach 0 + * subword_arrays[effective_words] = word_subwords + */ + if (!(likely(((__pyx_v_word_subwords) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_word_subwords, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 452, __pyx_L1_error) + (__pyx_v_subwords_idx[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_v_word_subwords))); + + /* "gensim/models/fasttext_inner.pyx":454 + * subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + * # ensures reference count of word_subwords doesn't reach 0 + * subword_arrays[effective_words] = word_subwords # <<<<<<<<<<<<<< + * + * if hs: + */ + __pyx_t_16 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 454, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + if (unlikely(PyDict_SetItem(__pyx_v_subword_arrays, __pyx_t_16, __pyx_v_word_subwords) < 0)) __PYX_ERR(0, 454, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":456 + * subword_arrays[effective_words] = word_subwords + * + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":457 + * + * if hs: + * codelens[effective_words] = len(word.code) # <<<<<<<<<<<<<< + * codes[effective_words] = np.PyArray_DATA(word.code) + * points[effective_words] = np.PyArray_DATA(word.point) + */ + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 457, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_t_18 = PyObject_Length(__pyx_t_16); if (unlikely(__pyx_t_18 == -1)) __PYX_ERR(0, 457, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + (__pyx_v_codelens[__pyx_v_effective_words]) = ((int)__pyx_t_18); + + /* "gensim/models/fasttext_inner.pyx":458 + * if hs: + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) # <<<<<<<<<<<<<< + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + */ + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 458, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + if (!(likely(((__pyx_t_16) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_16, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 458, __pyx_L1_error) + (__pyx_v_codes[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_16))); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":459 + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + * points[effective_words] = np.PyArray_DATA(word.point) # <<<<<<<<<<<<<< + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: + */ + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 459, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + if (!(likely(((__pyx_t_16) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_16, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 459, __pyx_L1_error) + (__pyx_v_points[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_16))); + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":456 + * subword_arrays[effective_words] = word_subwords + * + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + } + + /* "gensim/models/fasttext_inner.pyx":460 + * codes[effective_words] = np.PyArray_DATA(word.code) + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 # <<<<<<<<<<<<<< + * if effective_words == MAX_SENTENCE_LEN: + * break + */ + __pyx_v_effective_words = (__pyx_v_effective_words + 1); + + /* "gensim/models/fasttext_inner.pyx":461 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break + * + */ + __pyx_t_5 = ((__pyx_v_effective_words == 0x2710) != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":462 + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: + * break # <<<<<<<<<<<<<< + * + * # keep track of which words go into which sentence, so we don't train + */ + goto __pyx_L12_break; + + /* "gensim/models/fasttext_inner.pyx":461 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":441 + * if not sent: + * continue # ignore empty sentences; leave effective_sentences unchanged + * for token in sent: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + __pyx_L11_continue:; + } + __pyx_L12_break:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "gensim/models/fasttext_inner.pyx":467 + * # across sentence boundaries. + * # indices of sentence number X are between tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 474, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_16))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_16)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_16, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 474, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_16, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 474, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_16)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_16, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 474, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_16, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 474, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_10(__pyx_t_16); + if (unlikely(!__pyx_t_3)) { + 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, 474, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_v_i = __pyx_t_2; + __pyx_t_2 = (__pyx_t_2 + 1); + + /* "gensim/models/fasttext_inner.pyx":475 + * # precompute "reduced window" offsets in a single randint() call + * for i, item in enumerate(model.random.randint(0, window, effective_words)): + * reduced_windows[i] = item # <<<<<<<<<<<<<< + * + * # release GIL & train on all sentences + */ + __pyx_t_15 = __Pyx_PyInt_As_npy_uint32(__pyx_v_item); if (unlikely((__pyx_t_15 == ((npy_uint32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 475, __pyx_L1_error) + (__pyx_v_reduced_windows[__pyx_v_i]) = __pyx_t_15; + + /* "gensim/models/fasttext_inner.pyx":474 + * + * # precompute "reduced window" offsets in a single randint() call + * for i, item in enumerate(model.random.randint(0, window, effective_words)): # <<<<<<<<<<<<<< + * reduced_windows[i] = item + * + */ + } + __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0; + + /* "gensim/models/fasttext_inner.pyx":478 + * + * # release GIL & train on all sentences + * with nogil: # <<<<<<<<<<<<<< + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + #endif + /*try:*/ { + + /* "gensim/models/fasttext_inner.pyx":479 + * # release GIL & train on all sentences + * with nogil: + * for sent_idx in range(effective_sentences): # <<<<<<<<<<<<<< + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + */ + __pyx_t_2 = __pyx_v_effective_sentences; + for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_2; __pyx_t_20+=1) { + __pyx_v_sent_idx = __pyx_t_20; + + /* "gensim/models/fasttext_inner.pyx":480 + * with nogil: + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] # <<<<<<<<<<<<<< + * idx_end = sentence_idx[sent_idx + 1] + * for i in range(idx_start, idx_end): + */ + __pyx_v_idx_start = (__pyx_v_sentence_idx[__pyx_v_sent_idx]); + + /* "gensim/models/fasttext_inner.pyx":481 + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] # <<<<<<<<<<<<<< + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + */ + __pyx_v_idx_end = (__pyx_v_sentence_idx[(__pyx_v_sent_idx + 1)]); + + /* "gensim/models/fasttext_inner.pyx":482 + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + * for i in range(idx_start, idx_end): # <<<<<<<<<<<<<< + * j = i - window + reduced_windows[i] + * if j < idx_start: + */ + __pyx_t_21 = __pyx_v_idx_end; + for (__pyx_t_22 = __pyx_v_idx_start; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) { + __pyx_v_i = __pyx_t_22; + + /* "gensim/models/fasttext_inner.pyx":483 + * idx_end = sentence_idx[sent_idx + 1] + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] # <<<<<<<<<<<<<< + * if j < idx_start: + * j = idx_start + */ + __pyx_v_j = ((__pyx_v_i - __pyx_v_window) + (__pyx_v_reduced_windows[__pyx_v_i])); + + /* "gensim/models/fasttext_inner.pyx":484 + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + * if j < idx_start: # <<<<<<<<<<<<<< + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + */ + __pyx_t_5 = ((__pyx_v_j < __pyx_v_idx_start) != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":485 + * j = i - window + reduced_windows[i] + * if j < idx_start: + * j = idx_start # <<<<<<<<<<<<<< + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: + */ + __pyx_v_j = __pyx_v_idx_start; + + /* "gensim/models/fasttext_inner.pyx":484 + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + * if j < idx_start: # <<<<<<<<<<<<<< + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + */ + } + + /* "gensim/models/fasttext_inner.pyx":486 + * if j < idx_start: + * j = idx_start + * k = i + window + 1 - reduced_windows[i] # <<<<<<<<<<<<<< + * if k > idx_end: + * k = idx_end + */ + __pyx_v_k = (((__pyx_v_i + __pyx_v_window) + 1) - (__pyx_v_reduced_windows[__pyx_v_i])); + + /* "gensim/models/fasttext_inner.pyx":487 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * + */ + __pyx_t_5 = ((__pyx_v_k > __pyx_v_idx_end) != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":488 + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: + * k = idx_end # <<<<<<<<<<<<<< + * + * if hs: + */ + __pyx_v_k = __pyx_v_idx_end; + + /* "gensim/models/fasttext_inner.pyx":487 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * + */ + } + + /* "gensim/models/fasttext_inner.pyx":490 + * k = idx_end + * + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs( + * points[i], codes[i], codelens, neu1, syn0_vocab, syn0_ngrams, syn1, size,indexes, + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":491 + * + * if hs: + * fast_sentence_cbow_hs( # <<<<<<<<<<<<<< + * points[i], codes[i], codelens, neu1, syn0_vocab, syn0_ngrams, syn1, size,indexes, + * subwords_idx,subwords_idx_len,_alpha, work, i, j, k, cbow_mean, word_locks_vocab, + */ + __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_cbow_hs((__pyx_v_points[__pyx_v_i]), (__pyx_v_codes[__pyx_v_i]), __pyx_v_codelens, __pyx_v_neu1, __pyx_v_syn0_vocab, __pyx_v_syn0_ngrams, __pyx_v_syn1, __pyx_v_size, __pyx_v_indexes, __pyx_v_subwords_idx, __pyx_v_subwords_idx_len, __pyx_v__alpha, __pyx_v_work, __pyx_v_i, __pyx_v_j, __pyx_v_k, __pyx_v_cbow_mean, __pyx_v_word_locks_vocab, __pyx_v_word_locks_ngrams); + + /* "gensim/models/fasttext_inner.pyx":490 + * k = idx_end + * + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs( + * points[i], codes[i], codelens, neu1, syn0_vocab, syn0_ngrams, syn1, size,indexes, + */ + } + + /* "gensim/models/fasttext_inner.pyx":495 + * subwords_idx,subwords_idx_len,_alpha, work, i, j, k, cbow_mean, word_locks_vocab, + * word_locks_ngrams) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg( + * negative, cum_table, cum_table_len, codelens, neu1, syn0_vocab, syn0_ngrams, + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "gensim/models/fasttext_inner.pyx":496 + * word_locks_ngrams) + * if negative: + * next_random = fast_sentence_cbow_neg( # <<<<<<<<<<<<<< + * negative, cum_table, cum_table_len, codelens, neu1, syn0_vocab, syn0_ngrams, + * syn1neg, size, indexes, subwords_idx, subwords_idx_len, _alpha, work, i, j, k, + */ + __pyx_v_next_random = __pyx_f_6gensim_6models_14fasttext_inner_fast_sentence_cbow_neg(__pyx_v_negative, __pyx_v_cum_table, __pyx_v_cum_table_len, __pyx_v_codelens, __pyx_v_neu1, __pyx_v_syn0_vocab, __pyx_v_syn0_ngrams, __pyx_v_syn1neg, __pyx_v_size, __pyx_v_indexes, __pyx_v_subwords_idx, __pyx_v_subwords_idx_len, __pyx_v__alpha, __pyx_v_work, __pyx_v_i, __pyx_v_j, __pyx_v_k, __pyx_v_cbow_mean, __pyx_v_next_random, __pyx_v_word_locks_vocab, __pyx_v_word_locks_ngrams); + + /* "gensim/models/fasttext_inner.pyx":495 + * subwords_idx,subwords_idx_len,_alpha, work, i, j, k, cbow_mean, word_locks_vocab, + * word_locks_ngrams) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg( + * negative, cum_table, cum_table_len, codelens, neu1, syn0_vocab, syn0_ngrams, + */ + } + } + } + } + + /* "gensim/models/fasttext_inner.pyx":478 + * + * # release GIL & train on all sentences + * with nogil: # <<<<<<<<<<<<<< + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + Py_BLOCK_THREADS + #endif + goto __pyx_L26; + } + __pyx_L26:; + } + } + + /* "gensim/models/fasttext_inner.pyx":501 + * cbow_mean, next_random, word_locks_vocab, word_locks_ngrams) + * + * return effective_words # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_16 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 501, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __pyx_r = __pyx_t_16; + __pyx_t_16 = 0; + goto __pyx_L0; + + /* "gensim/models/fasttext_inner.pyx":377 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_AddTraceback("gensim.models.fasttext_inner.train_batch_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_subword_arrays); + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_sent); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XDECREF(__pyx_v_subwords); + __Pyx_XDECREF(__pyx_v_word_subwords); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XDECREF(__pyx_v_subword_i); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "gensim/models/fasttext_inner.pyx":504 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6gensim_6models_14fasttext_inner_5init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_6gensim_6models_14fasttext_inner_4init[] = "\n Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized\n into table EXP_TABLE. Also calculate log(sigmoid(x)) into LOG_TABLE.\n "; +static PyMethodDef __pyx_mdef_6gensim_6models_14fasttext_inner_5init = {"init", (PyCFunction)__pyx_pw_6gensim_6models_14fasttext_inner_5init, METH_NOARGS, __pyx_doc_6gensim_6models_14fasttext_inner_4init}; +static PyObject *__pyx_pw_6gensim_6models_14fasttext_inner_5init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("init (wrapper)", 0); + __pyx_r = __pyx_pf_6gensim_6models_14fasttext_inner_4init(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6gensim_6models_14fasttext_inner_4init(CYTHON_UNUSED PyObject *__pyx_self) { + int __pyx_v_i; + float *__pyx_v_x; + float *__pyx_v_y; + float __pyx_v_expected; + int __pyx_v_size; + double __pyx_v_d_res; + float *__pyx_v_p_res; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + float __pyx_t_1[1]; + float __pyx_t_2[1]; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("init", 0); + + /* "gensim/models/fasttext_inner.pyx":513 + * + * cdef int i + * cdef float *x = [10.0] # <<<<<<<<<<<<<< + * cdef float *y = [0.01] + * cdef float expected = 0.1 + */ + __pyx_t_1[0] = ((float)10.0); + __pyx_v_x = __pyx_t_1; + + /* "gensim/models/fasttext_inner.pyx":514 + * cdef int i + * cdef float *x = [10.0] + * cdef float *y = [0.01] # <<<<<<<<<<<<<< + * cdef float expected = 0.1 + * cdef int size = 1 + */ + __pyx_t_2[0] = ((float)0.01); + __pyx_v_y = __pyx_t_2; + + /* "gensim/models/fasttext_inner.pyx":515 + * cdef float *x = [10.0] + * cdef float *y = [0.01] + * cdef float expected = 0.1 # <<<<<<<<<<<<<< + * cdef int size = 1 + * cdef double d_res + */ + __pyx_v_expected = ((float)0.1); + + /* "gensim/models/fasttext_inner.pyx":516 + * cdef float *y = [0.01] + * cdef float expected = 0.1 + * cdef int size = 1 # <<<<<<<<<<<<<< + * cdef double d_res + * cdef float *p_res + */ + __pyx_v_size = 1; + + /* "gensim/models/fasttext_inner.pyx":521 + * + * # build the sigmoid table + * for i in range(EXP_TABLE_SIZE): # <<<<<<<<<<<<<< + * EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) + * EXP_TABLE[i] = (EXP_TABLE[i] / (EXP_TABLE[i] + 1)) + */ + for (__pyx_t_3 = 0; __pyx_t_3 < 0x3E8; __pyx_t_3+=1) { + __pyx_v_i = __pyx_t_3; + + /* "gensim/models/fasttext_inner.pyx":522 + * # build the sigmoid table + * for i in range(EXP_TABLE_SIZE): + * EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) # <<<<<<<<<<<<<< + * EXP_TABLE[i] = (EXP_TABLE[i] / (EXP_TABLE[i] + 1)) + * LOG_TABLE[i] = log( EXP_TABLE[i] ) + */ + (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)exp(((((__pyx_v_i / ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0x3E8)) * 2.0) - 1.0) * 6.0))); + + /* "gensim/models/fasttext_inner.pyx":523 + * for i in range(EXP_TABLE_SIZE): + * EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) + * EXP_TABLE[i] = (EXP_TABLE[i] / (EXP_TABLE[i] + 1)) # <<<<<<<<<<<<<< + * LOG_TABLE[i] = log( EXP_TABLE[i] ) + * + */ + (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)((__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]) / ((__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]) + 1.0))); + + /* "gensim/models/fasttext_inner.pyx":524 + * EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) + * EXP_TABLE[i] = (EXP_TABLE[i] / (EXP_TABLE[i] + 1)) + * LOG_TABLE[i] = log( EXP_TABLE[i] ) # <<<<<<<<<<<<<< + * + * # check whether sdot returns double or float + */ + (__pyx_v_6gensim_6models_14fasttext_inner_LOG_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)log((__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]))); + } + + /* "gensim/models/fasttext_inner.pyx":527 + * + * # check whether sdot returns double or float + * d_res = dsdot(&size, x, &ONE, y, &ONE) # <<<<<<<<<<<<<< + * p_res = &d_res + * if (abs(d_res - expected) < 0.0001): + */ + __pyx_v_d_res = __pyx_v_6gensim_6models_14word2vec_inner_dsdot((&__pyx_v_size), __pyx_v_x, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE), __pyx_v_y, (&__pyx_v_6gensim_6models_14fasttext_inner_ONE)); + + /* "gensim/models/fasttext_inner.pyx":528 + * # check whether sdot returns double or float + * d_res = dsdot(&size, x, &ONE, y, &ONE) + * p_res = &d_res # <<<<<<<<<<<<<< + * if (abs(d_res - expected) < 0.0001): + * our_dot = our_dot_double + */ + __pyx_v_p_res = ((float *)(&__pyx_v_d_res)); + + /* "gensim/models/fasttext_inner.pyx":529 + * d_res = dsdot(&size, x, &ONE, y, &ONE) + * p_res = &d_res + * if (abs(d_res - expected) < 0.0001): # <<<<<<<<<<<<<< + * our_dot = our_dot_double + * our_saxpy = saxpy + */ + __pyx_t_4 = ((fabs((__pyx_v_d_res - __pyx_v_expected)) < 0.0001) != 0); + if (__pyx_t_4) { + + /* "gensim/models/fasttext_inner.pyx":530 + * p_res = &d_res + * if (abs(d_res - expected) < 0.0001): + * our_dot = our_dot_double # <<<<<<<<<<<<<< + * our_saxpy = saxpy + * return 0 # double + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_dot = __pyx_f_6gensim_6models_14word2vec_inner_our_dot_double; + + /* "gensim/models/fasttext_inner.pyx":531 + * if (abs(d_res - expected) < 0.0001): + * our_dot = our_dot_double + * our_saxpy = saxpy # <<<<<<<<<<<<<< + * return 0 # double + * elif (abs(p_res[0] - expected) < 0.0001): + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy = __pyx_v_6gensim_6models_14word2vec_inner_saxpy; + + /* "gensim/models/fasttext_inner.pyx":532 + * our_dot = our_dot_double + * our_saxpy = saxpy + * return 0 # double # <<<<<<<<<<<<<< + * elif (abs(p_res[0] - expected) < 0.0001): + * our_dot = our_dot_float + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_int_0); + __pyx_r = __pyx_int_0; + goto __pyx_L0; + + /* "gensim/models/fasttext_inner.pyx":529 + * d_res = dsdot(&size, x, &ONE, y, &ONE) + * p_res = &d_res + * if (abs(d_res - expected) < 0.0001): # <<<<<<<<<<<<<< + * our_dot = our_dot_double + * our_saxpy = saxpy + */ + } + + /* "gensim/models/fasttext_inner.pyx":533 + * our_saxpy = saxpy + * return 0 # double + * elif (abs(p_res[0] - expected) < 0.0001): # <<<<<<<<<<<<<< + * our_dot = our_dot_float + * our_saxpy = saxpy + */ + __pyx_t_4 = ((fabsf(((__pyx_v_p_res[0]) - __pyx_v_expected)) < 0.0001) != 0); + if (__pyx_t_4) { + + /* "gensim/models/fasttext_inner.pyx":534 + * return 0 # double + * elif (abs(p_res[0] - expected) < 0.0001): + * our_dot = our_dot_float # <<<<<<<<<<<<<< + * our_saxpy = saxpy + * return 1 # float + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_dot = __pyx_f_6gensim_6models_14word2vec_inner_our_dot_float; + + /* "gensim/models/fasttext_inner.pyx":535 + * elif (abs(p_res[0] - expected) < 0.0001): + * our_dot = our_dot_float + * our_saxpy = saxpy # <<<<<<<<<<<<<< + * return 1 # float + * else: + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy = __pyx_v_6gensim_6models_14word2vec_inner_saxpy; + + /* "gensim/models/fasttext_inner.pyx":536 + * our_dot = our_dot_float + * our_saxpy = saxpy + * return 1 # float # <<<<<<<<<<<<<< + * else: + * # neither => use cython loops, no BLAS + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_int_1); + __pyx_r = __pyx_int_1; + goto __pyx_L0; + + /* "gensim/models/fasttext_inner.pyx":533 + * our_saxpy = saxpy + * return 0 # double + * elif (abs(p_res[0] - expected) < 0.0001): # <<<<<<<<<<<<<< + * our_dot = our_dot_float + * our_saxpy = saxpy + */ + } + + /* "gensim/models/fasttext_inner.pyx":540 + * # neither => use cython loops, no BLAS + * # actually, the BLAS is so messed up we'll probably have segfaulted above and never even reach here + * our_dot = our_dot_noblas # <<<<<<<<<<<<<< + * our_saxpy = our_saxpy_noblas + * return 2 + */ + /*else*/ { + __pyx_v_6gensim_6models_14word2vec_inner_our_dot = __pyx_f_6gensim_6models_14word2vec_inner_our_dot_noblas; + + /* "gensim/models/fasttext_inner.pyx":541 + * # actually, the BLAS is so messed up we'll probably have segfaulted above and never even reach here + * our_dot = our_dot_noblas + * our_saxpy = our_saxpy_noblas # <<<<<<<<<<<<<< + * return 2 + * + */ + __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy = __pyx_f_6gensim_6models_14word2vec_inner_our_saxpy_noblas; + + /* "gensim/models/fasttext_inner.pyx":542 + * our_dot = our_dot_noblas + * our_saxpy = our_saxpy_noblas + * return 2 # <<<<<<<<<<<<<< + * + * FAST_VERSION = init() # initialize the module + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_int_2); + __pyx_r = __pyx_int_2; + goto __pyx_L0; + } + + /* "gensim/models/fasttext_inner.pyx":504 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":197 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fullfill the PEP. + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_copy_shape; + int __pyx_v_i; + int __pyx_v_ndim; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + int __pyx_v_t; + char *__pyx_v_f; + PyArray_Descr *__pyx_v_descr = 0; + int __pyx_v_offset; + int __pyx_v_hasfields; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + char *__pyx_t_7; + __Pyx_RefNannySetupContext("__getbuffer__", 0); + if (__pyx_v_info != NULL) { + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":203 + * # of flags + * + * if info == NULL: return # <<<<<<<<<<<<<< + * + * cdef int copy_shape, i, ndim + */ + __pyx_t_1 = ((__pyx_v_info == NULL) != 0); + if (__pyx_t_1) { + __pyx_r = 0; + goto __pyx_L0; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":206 + * + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + */ + __pyx_v_endian_detector = 1; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":207 + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * + * ndim = PyArray_NDIM(self) + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":209 + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 + * ndim = PyArray_NDIM(self) + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * copy_shape = 1 + * else: + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":212 + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * copy_shape = 1 # <<<<<<<<<<<<<< + * else: + * copy_shape = 0 + */ + __pyx_v_copy_shape = 1; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 + * ndim = PyArray_NDIM(self) + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * copy_shape = 1 + * else: + */ + goto __pyx_L4; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":214 + * copy_shape = 1 + * else: + * copy_shape = 0 # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + */ + /*else*/ { + __pyx_v_copy_shape = 0; + } + __pyx_L4:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L6_bool_binop_done; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":217 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not C contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L6_bool_binop_done:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":218 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 218, __pyx_L1_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L9_bool_binop_done; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":221 + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not Fortran contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L9_bool_binop_done:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":222 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 222, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 222, __pyx_L1_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":224 + * raise ValueError(u"ndarray is not Fortran contiguous") + * + * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< + * info.ndim = ndim + * if copy_shape: + */ + __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":225 + * + * info.buf = PyArray_DATA(self) + * info.ndim = ndim # <<<<<<<<<<<<<< + * if copy_shape: + * # Allocate new buffer for strides and shape info. + */ + __pyx_v_info->ndim = __pyx_v_ndim; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":226 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if copy_shape: # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + __pyx_t_1 = (__pyx_v_copy_shape != 0); + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":229 + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< + * info.shape = info.strides + ndim + * for i in range(ndim): + */ + __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":230 + * # This is allocated as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim # <<<<<<<<<<<<<< + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + */ + __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":231 + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim + * for i in range(ndim): # <<<<<<<<<<<<<< + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] + */ + __pyx_t_4 = __pyx_v_ndim; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":232 + * info.shape = info.strides + ndim + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + */ + (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":233 + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< + * else: + * info.strides = PyArray_STRIDES(self) + */ + (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":226 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if copy_shape: # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + goto __pyx_L11; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":235 + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + */ + /*else*/ { + __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":236 + * else: + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + */ + __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); + } + __pyx_L11:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) + */ + __pyx_v_info->suboffsets = NULL; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":238 + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< + * info.readonly = not PyArray_ISWRITEABLE(self) + * + */ + __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":239 + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< + * + * cdef int t + */ + __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":242 + * + * cdef int t + * cdef char* f = NULL # <<<<<<<<<<<<<< + * cdef dtype descr = self.descr + * cdef int offset + */ + __pyx_v_f = NULL; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":243 + * cdef int t + * cdef char* f = NULL + * cdef dtype descr = self.descr # <<<<<<<<<<<<<< + * cdef int offset + * + */ + __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":246 + * cdef int offset + * + * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< + * + * if not hasfields and not copy_shape: + */ + __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 + * cdef bint hasfields = PyDataType_HASFIELDS(descr) + * + * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< + * # do not call releasebuffer + * info.obj = None + */ + __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L15_bool_binop_done:; + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":250 + * if not hasfields and not copy_shape: + * # do not call releasebuffer + * info.obj = None # <<<<<<<<<<<<<< + * else: + * # need to call releasebuffer + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = Py_None; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 + * cdef bint hasfields = PyDataType_HASFIELDS(descr) + * + * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< + * # do not call releasebuffer + * info.obj = None + */ + goto __pyx_L14; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":253 + * else: + * # need to call releasebuffer + * info.obj = self # <<<<<<<<<<<<<< + * + * if not hasfields: + */ + /*else*/ { + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + } + __pyx_L14:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0); + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":256 + * + * if not hasfields: + * t = descr.type_num # <<<<<<<<<<<<<< + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + */ + __pyx_t_4 = __pyx_v_descr->type_num; + __pyx_v_t = __pyx_t_4; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); + if (!__pyx_t_2) { + goto __pyx_L20_next_or; + } else { + } + __pyx_t_2 = (__pyx_v_little_endian != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L19_bool_binop_done; + } + __pyx_L20_next_or:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":258 + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L19_bool_binop_done:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":259 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 259, __pyx_L1_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":260 + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + */ + switch (__pyx_v_t) { + case NPY_BYTE: + __pyx_v_f = ((char *)"b"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":261 + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + */ + case NPY_UBYTE: + __pyx_v_f = ((char *)"B"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":262 + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + */ + case NPY_SHORT: + __pyx_v_f = ((char *)"h"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":263 + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + */ + case NPY_USHORT: + __pyx_v_f = ((char *)"H"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":264 + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + */ + case NPY_INT: + __pyx_v_f = ((char *)"i"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":265 + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + */ + case NPY_UINT: + __pyx_v_f = ((char *)"I"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":266 + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + */ + case NPY_LONG: + __pyx_v_f = ((char *)"l"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":267 + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + */ + case NPY_ULONG: + __pyx_v_f = ((char *)"L"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":268 + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + */ + case NPY_LONGLONG: + __pyx_v_f = ((char *)"q"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":269 + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + */ + case NPY_ULONGLONG: + __pyx_v_f = ((char *)"Q"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":270 + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + */ + case NPY_FLOAT: + __pyx_v_f = ((char *)"f"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":271 + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + */ + case NPY_DOUBLE: + __pyx_v_f = ((char *)"d"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":272 + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + */ + case NPY_LONGDOUBLE: + __pyx_v_f = ((char *)"g"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":273 + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + */ + case NPY_CFLOAT: + __pyx_v_f = ((char *)"Zf"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":274 + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" + */ + case NPY_CDOUBLE: + __pyx_v_f = ((char *)"Zd"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":275 + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f = "O" + * else: + */ + case NPY_CLONGDOUBLE: + __pyx_v_f = ((char *)"Zg"); + break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":276 + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + case NPY_OBJECT: + __pyx_v_f = ((char *)"O"); + break; + default: + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":278 + * elif t == NPY_OBJECT: f = "O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * info.format = f + * return + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __PYX_ERR(1, 278, __pyx_L1_error) + break; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":279 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f # <<<<<<<<<<<<<< + * return + * else: + */ + __pyx_v_info->format = __pyx_v_f; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":280 + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f + * return # <<<<<<<<<<<<<< + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":282 + * return + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + */ + /*else*/ { + __pyx_v_info->format = ((char *)malloc(0xFF)); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":283 + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, + */ + (__pyx_v_info->format[0]) = '^'; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":284 + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 # <<<<<<<<<<<<<< + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + */ + __pyx_v_offset = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":285 + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< + * info.format + _buffer_format_string_len, + * &offset) + */ + __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) __PYX_ERR(1, 285, __pyx_L1_error) + __pyx_v_f = __pyx_t_7; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":288 + * info.format + _buffer_format_string_len, + * &offset) + * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + */ + (__pyx_v_f[0]) = '\x00'; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":197 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fullfill the PEP. + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(Py_None); + __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; + } + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + */ + +/* Python wrapper */ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); + __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__releasebuffer__", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":292 + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) + */ + free(__pyx_v_info->format); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":293 + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * stdlib.free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":294 + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) # <<<<<<<<<<<<<< + * # info.shape was stored after info.strides in the same block + * + */ + free(__pyx_v_info->strides); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":293 + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * stdlib.free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":771 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 771, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":774 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":777 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":780 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":783 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { + PyArray_Descr *__pyx_v_child = 0; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + PyObject *__pyx_v_fields = 0; + PyObject *__pyx_v_childname = NULL; + PyObject *__pyx_v_new_offset = NULL; + PyObject *__pyx_v_t = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + long __pyx_t_8; + char *__pyx_t_9; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":790 + * + * cdef dtype child + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef tuple fields + */ + __pyx_v_endian_detector = 1; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":791 + * cdef dtype child + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * cdef tuple fields + * + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + if (unlikely(__pyx_v_descr->names == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(1, 794, __pyx_L1_error) + } + __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 794, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 794, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":795 + * + * for childname in descr.names: + * fields = descr.fields[childname] # <<<<<<<<<<<<<< + * child, new_offset = fields + * + */ + if (unlikely(__pyx_v_descr->fields == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 795, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 795, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 795, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":796 + * for childname in descr.names: + * fields = descr.fields[childname] + * child, new_offset = fields # <<<<<<<<<<<<<< + * + * if (end - f) - (new_offset - offset[0]) < 15: + */ + if (likely(__pyx_v_fields != Py_None)) { + PyObject* sequence = __pyx_v_fields; + #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(1, 796, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 796, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 796, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 796, __pyx_L1_error) + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 796, __pyx_L1_error) + __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); + __pyx_t_3 = 0; + __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 798, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 798, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 798, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); + if (__pyx_t_6) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 799, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 799, __pyx_L1_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); + if (!__pyx_t_7) { + goto __pyx_L8_next_or; + } else { + } + __pyx_t_7 = (__pyx_v_little_endian != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_L8_next_or:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":802 + * + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * # One could encode it in the format string and have Cython + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_6 = __pyx_t_7; + __pyx_L7_bool_binop_done:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (__pyx_t_6) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":803 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 803, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 803, __pyx_L1_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":813 + * + * # Output padding bytes + * while offset[0] < new_offset: # <<<<<<<<<<<<<< + * f[0] = 120 # "x"; pad byte + * f += 1 + */ + while (1) { + __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 813, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 813, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 813, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":814 + * # Output padding bytes + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< + * f += 1 + * offset[0] += 1 + */ + (__pyx_v_f[0]) = 0x78; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":815 + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte + * f += 1 # <<<<<<<<<<<<<< + * offset[0] += 1 + * + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":816 + * f[0] = 120 # "x"; pad byte + * f += 1 + * offset[0] += 1 # <<<<<<<<<<<<<< + * + * offset[0] += child.itemsize + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":818 + * offset[0] += 1 + * + * offset[0] += child.itemsize # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(child): + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); + if (__pyx_t_6) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":821 + * + * if not PyDataType_HASFIELDS(child): + * t = child.type_num # <<<<<<<<<<<<<< + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 821, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":822 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); + if (__pyx_t_6) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":823 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 823, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(1, 823, __pyx_L1_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":822 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":826 + * + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 826, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 826, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 826, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":827 + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 827, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 827, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 827, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":828 + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 828, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 828, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 828, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":829 + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 829, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 829, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 829, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":830 + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 830, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 830, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 830, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":831 + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 831, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 831, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 831, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":832 + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 832, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":833 + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 833, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 833, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 833, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":834 + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 834, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":835 + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 835, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 835, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 835, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":836 + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 836, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 836, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 836, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":837 + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 837, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":838 + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 838, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":839 + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 839, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x66; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":840 + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 840, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x64; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":841 + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 841, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x67; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":842 + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 842, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":844 + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * f += 1 + * else: + */ + /*else*/ { + __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 844, __pyx_L1_error) + } + __pyx_L15:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":845 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * f += 1 # <<<<<<<<<<<<<< + * else: + * # Cython ignores struct boundary information ("T{...}"), + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + goto __pyx_L13; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":849 + * # Cython ignores struct boundary information ("T{...}"), + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< + * return f + * + */ + /*else*/ { + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) __PYX_ERR(1, 849, __pyx_L1_error) + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":850 + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) + * return f # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_child); + __Pyx_XDECREF(__pyx_v_fields); + __Pyx_XDECREF(__pyx_v_childname); + __Pyx_XDECREF(__pyx_v_new_offset); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + PyObject *__pyx_v_baseptr; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("set_array_base", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":968 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + __pyx_t_1 = (__pyx_v_base == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":969 + * cdef PyObject* baseptr + * if base is None: + * baseptr = NULL # <<<<<<<<<<<<<< + * else: + * Py_INCREF(base) # important to do this before decref below! + */ + __pyx_v_baseptr = NULL; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":968 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + goto __pyx_L3; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":971 + * baseptr = NULL + * else: + * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< + * baseptr = base + * Py_XDECREF(arr.base) + */ + /*else*/ { + Py_INCREF(__pyx_v_base); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":972 + * else: + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base # <<<<<<<<<<<<<< + * Py_XDECREF(arr.base) + * arr.base = baseptr + */ + __pyx_v_baseptr = ((PyObject *)__pyx_v_base); + } + __pyx_L3:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":973 + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base + * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< + * arr.base = baseptr + * + */ + Py_XDECREF(__pyx_v_arr->base); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":974 + * baseptr = base + * Py_XDECREF(arr.base) + * arr.base = baseptr # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_v_arr->base = __pyx_v_baseptr; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); + if (__pyx_t_1) { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":978 + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: + * return None # <<<<<<<<<<<<<< + * else: + * return arr.base + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_None); + __pyx_r = Py_None; + goto __pyx_L0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":980 + * return None + * else: + * return arr.base # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); + __pyx_r = ((PyObject *)__pyx_v_arr->base); + goto __pyx_L0; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":985 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_array", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":986 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":987 + * cdef inline int import_array() except -1: + * try: + * _import_array() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") + */ + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 987, __pyx_L3_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":986 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_try_end; + __pyx_L3_error:; + __Pyx_PyThreadState_assign + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":988 + * try: + * _import_array() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.multiarray failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 988, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":989 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 989, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 989, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":986 + * # Cython code. + * cdef inline int import_array() except -1: + * try: # <<<<<<<<<<<<<< + * _import_array() + * except Exception: + */ + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L10_try_end:; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":985 + * # Versions of the import_* functions which are more suitable for + * # Cython code. + * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< + * try: + * _import_array() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":991 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_umath", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":993 + * cdef inline int import_umath() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 993, __pyx_L3_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_try_end; + __pyx_L3_error:; + __Pyx_PyThreadState_assign + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":994 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 994, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":995 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 995, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 995, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 + * + * cdef inline int import_umath() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L10_try_end:; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":991 + * raise ImportError("numpy.core.multiarray failed to import") + * + * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + +static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("import_ufunc", 0); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":999 + * cdef inline int import_ufunc() except -1: + * try: + * _import_umath() # <<<<<<<<<<<<<< + * except Exception: + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 999, __pyx_L3_error) + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L10_try_end; + __pyx_L3_error:; + __Pyx_PyThreadState_assign + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":1000 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1000, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":1001 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1001, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 1001, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L10_try_end:; + } + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + #if PY_VERSION_HEX < 0x03020000 + { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, + #else + PyModuleDef_HEAD_INIT, + #endif + "fasttext_inner", + 0, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_FAST_VERSION, __pyx_k_FAST_VERSION, sizeof(__pyx_k_FAST_VERSION), 0, 0, 1, 1}, + {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, + {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, + {&__pyx_n_s_MAX_WORDS_IN_BATCH, __pyx_k_MAX_WORDS_IN_BATCH, sizeof(__pyx_k_MAX_WORDS_IN_BATCH), 0, 0, 1, 1}, + {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, + {&__pyx_n_s_REAL, __pyx_k_REAL, sizeof(__pyx_k_REAL), 0, 0, 1, 1}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s__14, __pyx_k__14, sizeof(__pyx_k__14), 0, 0, 1, 1}, + {&__pyx_n_s_alpha, __pyx_k_alpha, sizeof(__pyx_k_alpha), 0, 0, 1, 1}, + {&__pyx_n_s_alpha_2, __pyx_k_alpha_2, sizeof(__pyx_k_alpha_2), 0, 0, 1, 1}, + {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1}, + {&__pyx_n_s_cbow_mean, __pyx_k_cbow_mean, sizeof(__pyx_k_cbow_mean), 0, 0, 1, 1}, + {&__pyx_n_s_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 0, 1, 1}, + {&__pyx_n_s_codelens, __pyx_k_codelens, sizeof(__pyx_k_codelens), 0, 0, 1, 1}, + {&__pyx_n_s_codes, __pyx_k_codes, sizeof(__pyx_k_codes), 0, 0, 1, 1}, + {&__pyx_n_s_cum_table, __pyx_k_cum_table, sizeof(__pyx_k_cum_table), 0, 0, 1, 1}, + {&__pyx_n_s_cum_table_len, __pyx_k_cum_table_len, sizeof(__pyx_k_cum_table_len), 0, 0, 1, 1}, + {&__pyx_n_s_d_res, __pyx_k_d_res, sizeof(__pyx_k_d_res), 0, 0, 1, 1}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_effective_sentences, __pyx_k_effective_sentences, sizeof(__pyx_k_effective_sentences), 0, 0, 1, 1}, + {&__pyx_n_s_effective_words, __pyx_k_effective_words, sizeof(__pyx_k_effective_words), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_expected, __pyx_k_expected, sizeof(__pyx_k_expected), 0, 0, 1, 1}, + {&__pyx_n_s_fblas, __pyx_k_fblas, sizeof(__pyx_k_fblas), 0, 0, 1, 1}, + {&__pyx_n_s_float32, __pyx_k_float32, sizeof(__pyx_k_float32), 0, 0, 1, 1}, + {&__pyx_n_s_gensim_models_fasttext_inner, __pyx_k_gensim_models_fasttext_inner, sizeof(__pyx_k_gensim_models_fasttext_inner), 0, 0, 1, 1}, + {&__pyx_kp_s_gensim_models_fasttext_inner_pyx, __pyx_k_gensim_models_fasttext_inner_pyx, sizeof(__pyx_k_gensim_models_fasttext_inner_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_hs, __pyx_k_hs, sizeof(__pyx_k_hs), 0, 0, 1, 1}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_idx_end, __pyx_k_idx_end, sizeof(__pyx_k_idx_end), 0, 0, 1, 1}, + {&__pyx_n_s_idx_start, __pyx_k_idx_start, sizeof(__pyx_k_idx_start), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1}, + {&__pyx_n_s_index2word, __pyx_k_index2word, sizeof(__pyx_k_index2word), 0, 0, 1, 1}, + {&__pyx_n_s_indexes, __pyx_k_indexes, sizeof(__pyx_k_indexes), 0, 0, 1, 1}, + {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1}, + {&__pyx_n_s_item, __pyx_k_item, sizeof(__pyx_k_item), 0, 0, 1, 1}, + {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, + {&__pyx_n_s_k, __pyx_k_k, sizeof(__pyx_k_k), 0, 0, 1, 1}, + {&__pyx_n_s_l1, __pyx_k_l1, sizeof(__pyx_k_l1), 0, 0, 1, 1}, + {&__pyx_n_s_l1_2, __pyx_k_l1_2, sizeof(__pyx_k_l1_2), 0, 0, 1, 1}, + {&__pyx_n_s_layer1_size, __pyx_k_layer1_size, sizeof(__pyx_k_layer1_size), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_model, __pyx_k_model, sizeof(__pyx_k_model), 0, 0, 1, 1}, + {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, + {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, + {&__pyx_n_s_negative, __pyx_k_negative, sizeof(__pyx_k_negative), 0, 0, 1, 1}, + {&__pyx_n_s_neu1, __pyx_k_neu1, sizeof(__pyx_k_neu1), 0, 0, 1, 1}, + {&__pyx_n_s_neu1_2, __pyx_k_neu1_2, sizeof(__pyx_k_neu1_2), 0, 0, 1, 1}, + {&__pyx_n_s_next_random, __pyx_k_next_random, sizeof(__pyx_k_next_random), 0, 0, 1, 1}, + {&__pyx_n_s_ngrams, __pyx_k_ngrams, sizeof(__pyx_k_ngrams), 0, 0, 1, 1}, + {&__pyx_n_s_ngrams_word, __pyx_k_ngrams_word, sizeof(__pyx_k_ngrams_word), 0, 0, 1, 1}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, + {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, + {&__pyx_n_s_p_res, __pyx_k_p_res, sizeof(__pyx_k_p_res), 0, 0, 1, 1}, + {&__pyx_n_s_point, __pyx_k_point, sizeof(__pyx_k_point), 0, 0, 1, 1}, + {&__pyx_n_s_points, __pyx_k_points, sizeof(__pyx_k_points), 0, 0, 1, 1}, + {&__pyx_n_s_randint, __pyx_k_randint, sizeof(__pyx_k_randint), 0, 0, 1, 1}, + {&__pyx_n_s_random, __pyx_k_random, sizeof(__pyx_k_random), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_reduced_windows, __pyx_k_reduced_windows, sizeof(__pyx_k_reduced_windows), 0, 0, 1, 1}, + {&__pyx_n_s_sample, __pyx_k_sample, sizeof(__pyx_k_sample), 0, 0, 1, 1}, + {&__pyx_n_s_sample_int, __pyx_k_sample_int, sizeof(__pyx_k_sample_int), 0, 0, 1, 1}, + {&__pyx_n_s_scipy_linalg_blas, __pyx_k_scipy_linalg_blas, sizeof(__pyx_k_scipy_linalg_blas), 0, 0, 1, 1}, + {&__pyx_n_s_sent, __pyx_k_sent, sizeof(__pyx_k_sent), 0, 0, 1, 1}, + {&__pyx_n_s_sent_idx, __pyx_k_sent_idx, sizeof(__pyx_k_sent_idx), 0, 0, 1, 1}, + {&__pyx_n_s_sentence_idx, __pyx_k_sentence_idx, sizeof(__pyx_k_sentence_idx), 0, 0, 1, 1}, + {&__pyx_n_s_sentences, __pyx_k_sentences, sizeof(__pyx_k_sentences), 0, 0, 1, 1}, + {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, + {&__pyx_n_s_subword_arrays, __pyx_k_subword_arrays, sizeof(__pyx_k_subword_arrays), 0, 0, 1, 1}, + {&__pyx_n_s_subword_i, __pyx_k_subword_i, sizeof(__pyx_k_subword_i), 0, 0, 1, 1}, + {&__pyx_n_s_subwords, __pyx_k_subwords, sizeof(__pyx_k_subwords), 0, 0, 1, 1}, + {&__pyx_n_s_subwords_idx, __pyx_k_subwords_idx, sizeof(__pyx_k_subwords_idx), 0, 0, 1, 1}, + {&__pyx_n_s_subwords_idx_len, __pyx_k_subwords_idx_len, sizeof(__pyx_k_subwords_idx_len), 0, 0, 1, 1}, + {&__pyx_n_s_syn0_ngrams, __pyx_k_syn0_ngrams, sizeof(__pyx_k_syn0_ngrams), 0, 0, 1, 1}, + {&__pyx_n_s_syn0_ngrams_lockf, __pyx_k_syn0_ngrams_lockf, sizeof(__pyx_k_syn0_ngrams_lockf), 0, 0, 1, 1}, + {&__pyx_n_s_syn0_vocab, __pyx_k_syn0_vocab, sizeof(__pyx_k_syn0_vocab), 0, 0, 1, 1}, + {&__pyx_n_s_syn0_vocab_lockf, __pyx_k_syn0_vocab_lockf, sizeof(__pyx_k_syn0_vocab_lockf), 0, 0, 1, 1}, + {&__pyx_n_s_syn1, __pyx_k_syn1, sizeof(__pyx_k_syn1), 0, 0, 1, 1}, + {&__pyx_n_s_syn1neg, __pyx_k_syn1neg, sizeof(__pyx_k_syn1neg), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_token, __pyx_k_token, sizeof(__pyx_k_token), 0, 0, 1, 1}, + {&__pyx_n_s_train_batch_cbow, __pyx_k_train_batch_cbow, sizeof(__pyx_k_train_batch_cbow), 0, 0, 1, 1}, + {&__pyx_n_s_train_batch_sg, __pyx_k_train_batch_sg, sizeof(__pyx_k_train_batch_sg), 0, 0, 1, 1}, + {&__pyx_n_s_uint32, __pyx_k_uint32, sizeof(__pyx_k_uint32), 0, 0, 1, 1}, + {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, + {&__pyx_n_s_vlookup, __pyx_k_vlookup, sizeof(__pyx_k_vlookup), 0, 0, 1, 1}, + {&__pyx_n_s_vocab, __pyx_k_vocab, sizeof(__pyx_k_vocab), 0, 0, 1, 1}, + {&__pyx_n_s_window, __pyx_k_window, sizeof(__pyx_k_window), 0, 0, 1, 1}, + {&__pyx_n_s_word, __pyx_k_word, sizeof(__pyx_k_word), 0, 0, 1, 1}, + {&__pyx_n_s_word_locks_ngrams, __pyx_k_word_locks_ngrams, sizeof(__pyx_k_word_locks_ngrams), 0, 0, 1, 1}, + {&__pyx_n_s_word_locks_vocab, __pyx_k_word_locks_vocab, sizeof(__pyx_k_word_locks_vocab), 0, 0, 1, 1}, + {&__pyx_n_s_word_subwords, __pyx_k_word_subwords, sizeof(__pyx_k_word_subwords), 0, 0, 1, 1}, + {&__pyx_n_s_work, __pyx_k_work, sizeof(__pyx_k_work), 0, 0, 1, 1}, + {&__pyx_n_s_work_2, __pyx_k_work_2, sizeof(__pyx_k_work_2), 0, 0, 1, 1}, + {&__pyx_n_s_wv, __pyx_k_wv, sizeof(__pyx_k_wv), 0, 0, 1, 1}, + {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1}, + {&__pyx_n_s_y, __pyx_k_y, sizeof(__pyx_k_y), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(0, 18, __pyx_L1_error) + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 62, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(0, 346, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 218, __pyx_L1_error) + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 799, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "gensim/models/fasttext_inner.pyx":300 + * cum_table_len = len(model.cum_table) + * if negative or sample: + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< + * + * # convert Python structures to primitive types, so we can release the GIL + */ + __pyx_tuple_ = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + __pyx_tuple__2 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 300, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "gensim/models/fasttext_inner.pyx":429 + * cum_table_len = len(model.cum_table) + * if negative or sample: + * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< + * + * # convert Python structures to primitive types, so we can release the GIL + */ + __pyx_tuple__3 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + __pyx_tuple__4 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 429, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":218 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":222 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 222, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":259 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 259, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 799, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":803 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 803, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":823 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 823, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":989 + * _import_array() + * except Exception: + * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_umath() except -1: + */ + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 989, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":995 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef inline int import_ufunc() except -1: + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 995, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":1001 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(1, 1001, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + + /* "gensim/models/fasttext_inner.pyx":247 + * + * + * def train_batch_sg(model, sentences, alpha, _work, _l1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_tuple__15 = PyTuple_Pack(47, __pyx_n_s_model, __pyx_n_s_sentences, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_l1, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_syn0_vocab, __pyx_n_s_word_locks_vocab, __pyx_n_s_syn0_ngrams, __pyx_n_s_word_locks_ngrams, __pyx_n_s_work_2, __pyx_n_s_l1_2, __pyx_n_s_alpha_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_reduced_windows, __pyx_n_s_sentence_idx, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_effective_words, __pyx_n_s_effective_sentences, __pyx_n_s_sent_idx, __pyx_n_s_idx_start, __pyx_n_s_idx_end, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_syn1neg, __pyx_n_s_cum_table, __pyx_n_s_cum_table_len, __pyx_n_s_next_random, __pyx_n_s_subwords_idx_len, __pyx_n_s_subwords_idx, __pyx_n_s_subword_arrays, __pyx_n_s_vlookup, __pyx_n_s_sent, __pyx_n_s_token, __pyx_n_s_word, __pyx_n_s_subwords, __pyx_n_s_word_subwords, __pyx_n_s_item, __pyx_n_s_subword_i); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 247, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(5, 0, 47, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_fasttext_inner_pyx, __pyx_n_s_train_batch_sg, 247, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 247, __pyx_L1_error) + + /* "gensim/models/fasttext_inner.pyx":377 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_tuple__17 = PyTuple_Pack(48, __pyx_n_s_model, __pyx_n_s_sentences, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_neu1, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_cbow_mean, __pyx_n_s_syn0_vocab, __pyx_n_s_word_locks_vocab, __pyx_n_s_syn0_ngrams, __pyx_n_s_word_locks_ngrams, __pyx_n_s_work_2, __pyx_n_s_alpha_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_reduced_windows, __pyx_n_s_sentence_idx, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_effective_words, __pyx_n_s_effective_sentences, __pyx_n_s_sent_idx, __pyx_n_s_idx_start, __pyx_n_s_idx_end, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_syn1neg, __pyx_n_s_cum_table, __pyx_n_s_cum_table_len, __pyx_n_s_next_random, __pyx_n_s_subwords_idx_len, __pyx_n_s_subwords_idx, __pyx_n_s_subword_arrays, __pyx_n_s_neu1_2, __pyx_n_s_vlookup, __pyx_n_s_sent, __pyx_n_s_token, __pyx_n_s_word, __pyx_n_s_subwords, __pyx_n_s_word_subwords, __pyx_n_s_item, __pyx_n_s_subword_i); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 377, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__17); + __Pyx_GIVEREF(__pyx_tuple__17); + __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(5, 0, 48, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_fasttext_inner_pyx, __pyx_n_s_train_batch_cbow, 377, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) __PYX_ERR(0, 377, __pyx_L1_error) + + /* "gensim/models/fasttext_inner.pyx":504 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + __pyx_tuple__19 = PyTuple_Pack(7, __pyx_n_s_i, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_expected, __pyx_n_s_size, __pyx_n_s_d_res, __pyx_n_s_p_res); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); + __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(0, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_fasttext_inner_pyx, __pyx_n_s_init, 504, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_10000 = PyInt_FromLong(10000L); if (unlikely(!__pyx_int_10000)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_16777216 = PyInt_FromLong(16777216L); if (unlikely(!__pyx_int_16777216)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC initfasttext_inner(void); /*proto*/ +PyMODINIT_FUNC initfasttext_inner(void) +#else +PyMODINIT_FUNC PyInit_fasttext_inner(void); /*proto*/ +PyMODINIT_FUNC PyInit_fasttext_inner(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannyDeclarations + #if CYTHON_REFNANNY + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + #endif + __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_fasttext_inner(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("fasttext_inner", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_gensim__models__fasttext_inner) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "gensim.models.fasttext_inner")) { + if (unlikely(PyDict_SetItemString(modules, "gensim.models.fasttext_inner", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + /*--- Type import code ---*/ + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + #if CYTHON_COMPILING_IN_PYPY + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) __PYX_ERR(1, 155, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) __PYX_ERR(1, 168, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) __PYX_ERR(1, 172, __pyx_L1_error) + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) __PYX_ERR(1, 181, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) __PYX_ERR(1, 861, __pyx_L1_error) + /*--- Variable import code ---*/ + __pyx_t_1 = __Pyx_ImportModule("gensim.models.word2vec_inner"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "scopy", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_scopy, "__pyx_t_6gensim_6models_14word2vec_inner_scopy_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "saxpy", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_saxpy, "__pyx_t_6gensim_6models_14word2vec_inner_saxpy_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "sdot", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_sdot, "__pyx_t_6gensim_6models_14word2vec_inner_sdot_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "dsdot", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_dsdot, "__pyx_t_6gensim_6models_14word2vec_inner_dsdot_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "snrm2", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_snrm2, "__pyx_t_6gensim_6models_14word2vec_inner_snrm2_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "sscal", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_sscal, "__pyx_t_6gensim_6models_14word2vec_inner_sscal_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "EXP_TABLE", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_EXP_TABLE, "__pyx_t_6gensim_6models_14word2vec_inner_REAL_t [0x3E8]") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "our_dot", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_our_dot, "__pyx_t_6gensim_6models_14word2vec_inner_our_dot_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportVoidPtr(__pyx_t_1, "our_saxpy", (void **)&__pyx_vp_6gensim_6models_14word2vec_inner_our_saxpy, "__pyx_t_6gensim_6models_14word2vec_inner_our_saxpy_ptr") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; + /*--- Function import code ---*/ + __pyx_t_2 = __Pyx_ImportModule("gensim.models.word2vec_inner"); if (!__pyx_t_2) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_2, "our_dot_double", (void (**)(void))&__pyx_f_6gensim_6models_14word2vec_inner_our_dot_double, "__pyx_t_6gensim_6models_14word2vec_inner_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_2, "our_dot_float", (void (**)(void))&__pyx_f_6gensim_6models_14word2vec_inner_our_dot_float, "__pyx_t_6gensim_6models_14word2vec_inner_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_2, "our_dot_noblas", (void (**)(void))&__pyx_f_6gensim_6models_14word2vec_inner_our_dot_noblas, "__pyx_t_6gensim_6models_14word2vec_inner_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_2, "our_saxpy_noblas", (void (**)(void))&__pyx_f_6gensim_6models_14word2vec_inner_our_saxpy_noblas, "void (int const *, float const *, float const *, int const *, float *, int const *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_2, "bisect_left", (void (**)(void))&__pyx_f_6gensim_6models_14word2vec_inner_bisect_left, "unsigned PY_LONG_LONG (__pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_2, "random_int32", (void (**)(void))&__pyx_f_6gensim_6models_14word2vec_inner_random_int32, "unsigned PY_LONG_LONG (unsigned PY_LONG_LONG *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + Py_DECREF(__pyx_t_2); __pyx_t_2 = 0; + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "gensim/models/fasttext_inner.pyx":8 + * + * import cython + * import numpy as np # <<<<<<<<<<<<<< + * cimport numpy as np + * + */ + __pyx_t_3 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); 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_np, __pyx_t_3) < 0) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":16 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + /*try:*/ { + + /* "gensim/models/fasttext_inner.pyx":17 + * # scipy <= 0.15 + * try: + * from scipy.linalg.blas import fblas # <<<<<<<<<<<<<< + * except ImportError: + * # in scipy > 0.15, fblas function has been removed + */ + __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_s_fblas); + __Pyx_GIVEREF(__pyx_n_s_fblas); + PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_fblas); + __pyx_t_7 = __Pyx_Import(__pyx_n_s_scipy_linalg_blas, __pyx_t_3, -1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 17, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_7, __pyx_n_s_fblas); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L2_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fblas, __pyx_t_3) < 0) __PYX_ERR(0, 17, __pyx_L2_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "gensim/models/fasttext_inner.pyx":16 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + } + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L9_try_end; + __pyx_L2_error:; + __Pyx_PyThreadState_assign + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "gensim/models/fasttext_inner.pyx":18 + * try: + * from scipy.linalg.blas import fblas + * except ImportError: # <<<<<<<<<<<<<< + * # in scipy > 0.15, fblas function has been removed + * import scipy.linalg.blas as fblas + */ + __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_ImportError); + if (__pyx_t_8) { + __Pyx_AddTraceback("gensim.models.fasttext_inner", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_3, &__pyx_t_9) < 0) __PYX_ERR(0, 18, __pyx_L4_except_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_t_9); + + /* "gensim/models/fasttext_inner.pyx":20 + * except ImportError: + * # in scipy > 0.15, fblas function has been removed + * import scipy.linalg.blas as fblas # <<<<<<<<<<<<<< + * + * from word2vec_inner cimport bisect_left, random_int32, \ + */ + __pyx_t_10 = PyList_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 20, __pyx_L4_except_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_INCREF(__pyx_n_s__14); + __Pyx_GIVEREF(__pyx_n_s__14); + PyList_SET_ITEM(__pyx_t_10, 0, __pyx_n_s__14); + __pyx_t_11 = __Pyx_Import(__pyx_n_s_scipy_linalg_blas, __pyx_t_10, -1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 20, __pyx_L4_except_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fblas, __pyx_t_11) < 0) __PYX_ERR(0, 20, __pyx_L4_except_error) + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L3_exception_handled; + } + goto __pyx_L4_except_error; + __pyx_L4_except_error:; + + /* "gensim/models/fasttext_inner.pyx":16 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_PyThreadState_assign + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + __pyx_L9_try_end:; + } + + /* "gensim/models/fasttext_inner.pyx":28 + * our_dot_double, our_dot_float, our_dot_noblas, our_saxpy_noblas + * + * REAL = np.float32 # <<<<<<<<<<<<<< + * + * DEF MAX_SENTENCE_LEN = 10000 + */ + __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_float32); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_REAL, __pyx_t_3) < 0) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":39 + * cdef REAL_t[EXP_TABLE_SIZE] LOG_TABLE + * + * cdef int ONE = 1 # <<<<<<<<<<<<<< + * cdef REAL_t ONEF = 1.0 + * + */ + __pyx_v_6gensim_6models_14fasttext_inner_ONE = 1; + + /* "gensim/models/fasttext_inner.pyx":40 + * + * cdef int ONE = 1 + * cdef REAL_t ONEF = 1.0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_6gensim_6models_14fasttext_inner_ONEF = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)1.0); + + /* "gensim/models/fasttext_inner.pyx":247 + * + * + * def train_batch_sg(model, sentences, alpha, _work, _l1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_14fasttext_inner_1train_batch_sg, NULL, __pyx_n_s_gensim_models_fasttext_inner); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 247, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_train_batch_sg, __pyx_t_3) < 0) __PYX_ERR(0, 247, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":377 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_14fasttext_inner_3train_batch_cbow, NULL, __pyx_n_s_gensim_models_fasttext_inner); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 377, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_train_batch_cbow, __pyx_t_3) < 0) __PYX_ERR(0, 377, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":504 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_14fasttext_inner_5init, NULL, __pyx_n_s_gensim_models_fasttext_inner); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_init, __pyx_t_3) < 0) __PYX_ERR(0, 504, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":544 + * return 2 + * + * FAST_VERSION = init() # initialize the module # <<<<<<<<<<<<<< + * MAX_WORDS_IN_BATCH = MAX_SENTENCE_LEN + * + */ + __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_init); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 544, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_7 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_9))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_9); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_9, function); + } + } + if (__pyx_t_7) { + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_9, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 544, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } else { + __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_9); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 544, __pyx_L1_error) + } + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FAST_VERSION, __pyx_t_3) < 0) __PYX_ERR(0, 544, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/fasttext_inner.pyx":545 + * + * FAST_VERSION = init() # initialize the module + * MAX_WORDS_IN_BATCH = MAX_SENTENCE_LEN # <<<<<<<<<<<<<< + * + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_MAX_WORDS_IN_BATCH, __pyx_int_10000) < 0) __PYX_ERR(0, 545, __pyx_L1_error) + + /* "gensim/models/fasttext_inner.pyx":1 + * #!/usr/bin/env cython # <<<<<<<<<<<<<< + * # cython: boundscheck=False + * # cython: wraparound=False + */ + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init gensim.models.fasttext_inner", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init gensim.models.fasttext_inner"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(PyObject_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* GetModuleGlobalName */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +/* PyFunctionFastCall */ + #if CYTHON_FAST_PYCALL +#include "frameobject.h" +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = PyThreadState_GET(); + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = f->f_localsplus; + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif // CPython < 3.6 +#endif // CYTHON_FAST_PYCALL + +/* PyCFunctionFastCall */ + #if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + return (*((__Pyx_PyCFunctionFast)meth)) (self, args, nargs, NULL); +} +#endif // CYTHON_FAST_PYCCALL + +/* PyErrFetchRestore */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* RaiseException */ + #if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } +#if PY_VERSION_HEX >= 0x03030000 + if (cause) { +#else + if (cause && cause != Py_None) { +#endif + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* RaiseTooManyValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ + static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* SaveResetException */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* PyErrExceptionMatches */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) { + PyObject *exc_type = tstate->curexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + return PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* GetException */ + #if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { +#endif + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(1); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + #endif + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_VERSION_HEX < 0x03030000 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ + static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { +#else + if (likely(PyCFunction_Check(func))) { +#endif + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* PyObjectCallNoArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, NULL, 0); + } +#endif +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { +#else + if (likely(PyCFunction_Check(func))) { +#endif + if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { + return __Pyx_PyObject_CallMethO(func, NULL); + } + } + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); +} +#endif + +/* CodeObjectCache */ + static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + py_code = __pyx_find_code_object(c_line ? c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? c_line : py_line, py_code); + } + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_uint32(npy_uint32 value) { + const npy_uint32 neg_one = (npy_uint32) -1, const_zero = (npy_uint32) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_uint32) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_uint32) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_uint32) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_uint32) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_uint32) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(npy_uint32), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { + const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(unsigned PY_LONG_LONG), + little, !is_unsigned); + } +} + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabsf(b.real) >= fabsf(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + float r = b.imag / b.real; + float s = 1.0 / (b.real + b.imag * r); + return __pyx_t_float_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + float r = b.real / b.imag; + float s = 1.0 / (b.imag + b.real * r); + return __pyx_t_float_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + if (b.imag == 0) { + return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + float denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_float_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(a, a); + case 3: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, a); + case 4: + z = __Pyx_c_prod_float(a, a); + return __Pyx_c_prod_float(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = powf(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2f(0, -1); + } + } else { + r = __Pyx_c_abs_float(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +/* Declarations */ + #if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +/* Arithmetic */ + #if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + #if 1 + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else if (fabs(b.real) >= fabs(b.imag)) { + if (b.real == 0 && b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); + } else { + double r = b.imag / b.real; + double s = 1.0 / (b.real + b.imag * r); + return __pyx_t_double_complex_from_parts( + (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); + } + } else { + double r = b.real / b.imag; + double s = 1.0 / (b.imag + b.real * r); + return __pyx_t_double_complex_from_parts( + (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); + } + } + #else + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + if (b.imag == 0) { + return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); + } else { + double denom = b.real * b.real + b.imag * b.imag; + return __pyx_t_double_complex_from_parts( + (a.real * b.real + a.imag * b.imag) / denom, + (a.imag * b.real - a.real * b.imag) / denom); + } + } + #endif + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if (b.imag == 0) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0, -1); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_As_PY_LONG_LONG(PyObject *x) { + const PY_LONG_LONG neg_one = (PY_LONG_LONG) -1, const_zero = (PY_LONG_LONG) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(PY_LONG_LONG) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (PY_LONG_LONG) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (PY_LONG_LONG) 0; + case 1: __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, digit, digits[0]) + case 2: + if (8 * sizeof(PY_LONG_LONG) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) >= 2 * PyLong_SHIFT) { + return (PY_LONG_LONG) (((((PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(PY_LONG_LONG) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) >= 3 * PyLong_SHIFT) { + return (PY_LONG_LONG) (((((((PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(PY_LONG_LONG) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) >= 4 * PyLong_SHIFT) { + return (PY_LONG_LONG) (((((((((PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (PY_LONG_LONG) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(PY_LONG_LONG) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (PY_LONG_LONG) 0; + case -1: __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, digit, +digits[0]) + case -2: + if (8 * sizeof(PY_LONG_LONG) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + return (PY_LONG_LONG) (((PY_LONG_LONG)-1)*(((((PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(PY_LONG_LONG) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + return (PY_LONG_LONG) ((((((PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + return (PY_LONG_LONG) (((PY_LONG_LONG)-1)*(((((((PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(PY_LONG_LONG) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + return (PY_LONG_LONG) ((((((((PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + return (PY_LONG_LONG) (((PY_LONG_LONG)-1)*(((((((((PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(PY_LONG_LONG) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + return (PY_LONG_LONG) ((((((((((PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); + } + } + break; + } +#endif + if (sizeof(PY_LONG_LONG) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + PY_LONG_LONG val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (PY_LONG_LONG) -1; + } + } else { + PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (PY_LONG_LONG) -1; + val = __Pyx_PyInt_As_PY_LONG_LONG(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to PY_LONG_LONG"); + return (PY_LONG_LONG) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to PY_LONG_LONG"); + return (PY_LONG_LONG) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *x) { + const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (unsigned PY_LONG_LONG) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (unsigned PY_LONG_LONG) 0; + case 1: __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, digit, digits[0]) + case 2: + if (8 * sizeof(unsigned PY_LONG_LONG) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) >= 2 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(unsigned PY_LONG_LONG) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) >= 3 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(unsigned PY_LONG_LONG) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) >= 4 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (unsigned PY_LONG_LONG) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (unsigned PY_LONG_LONG) 0; + case -1: __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, digit, +digits[0]) + case -2: + if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) (((unsigned PY_LONG_LONG)-1)*(((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(unsigned PY_LONG_LONG) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) ((((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) (((unsigned PY_LONG_LONG)-1)*(((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(unsigned PY_LONG_LONG) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) ((((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) (((unsigned PY_LONG_LONG)-1)*(((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(unsigned PY_LONG_LONG) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + return (unsigned PY_LONG_LONG) ((((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); + } + } + break; + } +#endif + if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + unsigned PY_LONG_LONG val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (unsigned PY_LONG_LONG) -1; + } + } else { + unsigned PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (unsigned PY_LONG_LONG) -1; + val = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to unsigned PY_LONG_LONG"); + return (unsigned PY_LONG_LONG) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned PY_LONG_LONG"); + return (unsigned PY_LONG_LONG) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE npy_uint32 __Pyx_PyInt_As_npy_uint32(PyObject *x) { + const npy_uint32 neg_one = (npy_uint32) -1, const_zero = (npy_uint32) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(npy_uint32) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(npy_uint32, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (npy_uint32) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_uint32) 0; + case 1: __PYX_VERIFY_RETURN_INT(npy_uint32, digit, digits[0]) + case 2: + if (8 * sizeof(npy_uint32) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) >= 2 * PyLong_SHIFT) { + return (npy_uint32) (((((npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(npy_uint32) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) >= 3 * PyLong_SHIFT) { + return (npy_uint32) (((((((npy_uint32)digits[2]) << PyLong_SHIFT) | (npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(npy_uint32) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) >= 4 * PyLong_SHIFT) { + return (npy_uint32) (((((((((npy_uint32)digits[3]) << PyLong_SHIFT) | (npy_uint32)digits[2]) << PyLong_SHIFT) | (npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (npy_uint32) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(npy_uint32) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_uint32) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (npy_uint32) 0; + case -1: __PYX_VERIFY_RETURN_INT(npy_uint32, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(npy_uint32, digit, +digits[0]) + case -2: + if (8 * sizeof(npy_uint32) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) - 1 > 2 * PyLong_SHIFT) { + return (npy_uint32) (((npy_uint32)-1)*(((((npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(npy_uint32) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) - 1 > 2 * PyLong_SHIFT) { + return (npy_uint32) ((((((npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(npy_uint32) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) - 1 > 3 * PyLong_SHIFT) { + return (npy_uint32) (((npy_uint32)-1)*(((((((npy_uint32)digits[2]) << PyLong_SHIFT) | (npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(npy_uint32) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) - 1 > 3 * PyLong_SHIFT) { + return (npy_uint32) ((((((((npy_uint32)digits[2]) << PyLong_SHIFT) | (npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(npy_uint32) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) - 1 > 4 * PyLong_SHIFT) { + return (npy_uint32) (((npy_uint32)-1)*(((((((((npy_uint32)digits[3]) << PyLong_SHIFT) | (npy_uint32)digits[2]) << PyLong_SHIFT) | (npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(npy_uint32) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(npy_uint32, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(npy_uint32) - 1 > 4 * PyLong_SHIFT) { + return (npy_uint32) ((((((((((npy_uint32)digits[3]) << PyLong_SHIFT) | (npy_uint32)digits[2]) << PyLong_SHIFT) | (npy_uint32)digits[1]) << PyLong_SHIFT) | (npy_uint32)digits[0]))); + } + } + break; + } +#endif + if (sizeof(npy_uint32) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_uint32) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + npy_uint32 val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (npy_uint32) -1; + } + } else { + npy_uint32 val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (npy_uint32) -1; + val = __Pyx_PyInt_As_npy_uint32(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to npy_uint32"); + return (npy_uint32) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to npy_uint32"); + return (npy_uint32) -1; +} + +/* CheckBinaryVersion */ + static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* ModuleImport */ + #ifndef __PYX_HAVE_RT_ImportModule +#define __PYX_HAVE_RT_ImportModule +static PyObject *__Pyx_ImportModule(const char *name) { + PyObject *py_name = 0; + PyObject *py_module = 0; + py_name = __Pyx_PyIdentifier_FromString(name); + if (!py_name) + goto bad; + py_module = PyImport_Import(py_name); + Py_DECREF(py_name); + return py_module; +bad: + Py_XDECREF(py_name); + return 0; +} +#endif + +/* TypeImport */ + #ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, + size_t size, int strict) +{ + PyObject *py_module = 0; + PyObject *result = 0; + PyObject *py_name = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + py_module = __Pyx_ImportModule(module_name); + if (!py_module) + goto bad; + py_name = __Pyx_PyIdentifier_FromString(class_name); + if (!py_name) + goto bad; + result = PyObject_GetAttr(py_module, py_name); + Py_DECREF(py_name); + py_name = 0; + Py_DECREF(py_module); + py_module = 0; + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (!strict && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + else if ((size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd", + module_name, class_name, basicsize, size); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +/* VoidPtrImport */ + #ifndef __PYX_HAVE_RT_ImportVoidPtr +#define __PYX_HAVE_RT_ImportVoidPtr +static int __Pyx_ImportVoidPtr(PyObject *module, const char *name, void **p, const char *sig) { + PyObject *d = 0; + PyObject *cobj = 0; + d = PyObject_GetAttrString(module, (char *)"__pyx_capi__"); + if (!d) + goto bad; + cobj = PyDict_GetItemString(d, name); + if (!cobj) { + PyErr_Format(PyExc_ImportError, + "%.200s does not export expected C variable %.200s", + PyModule_GetName(module), name); + goto bad; + } +#if PY_VERSION_HEX >= 0x02070000 + if (!PyCapsule_IsValid(cobj, sig)) { + PyErr_Format(PyExc_TypeError, + "C variable %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", + PyModule_GetName(module), name, sig, PyCapsule_GetName(cobj)); + goto bad; + } + *p = PyCapsule_GetPointer(cobj, sig); +#else + {const char *desc, *s1, *s2; + desc = (const char *)PyCObject_GetDesc(cobj); + if (!desc) + goto bad; + s1 = desc; s2 = sig; + while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; } + if (*s1 != *s2) { + PyErr_Format(PyExc_TypeError, + "C variable %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", + PyModule_GetName(module), name, sig, desc); + goto bad; + } + *p = PyCObject_AsVoidPtr(cobj);} +#endif + if (!(*p)) + goto bad; + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(d); + return -1; +} +#endif + +/* FunctionImport */ + #ifndef __PYX_HAVE_RT_ImportFunction +#define __PYX_HAVE_RT_ImportFunction +static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig) { + PyObject *d = 0; + PyObject *cobj = 0; + union { + void (*fp)(void); + void *p; + } tmp; + d = PyObject_GetAttrString(module, (char *)"__pyx_capi__"); + if (!d) + goto bad; + cobj = PyDict_GetItemString(d, funcname); + if (!cobj) { + PyErr_Format(PyExc_ImportError, + "%.200s does not export expected C function %.200s", + PyModule_GetName(module), funcname); + goto bad; + } +#if PY_VERSION_HEX >= 0x02070000 + if (!PyCapsule_IsValid(cobj, sig)) { + PyErr_Format(PyExc_TypeError, + "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", + PyModule_GetName(module), funcname, sig, PyCapsule_GetName(cobj)); + goto bad; + } + tmp.p = PyCapsule_GetPointer(cobj, sig); +#else + {const char *desc, *s1, *s2; + desc = (const char *)PyCObject_GetDesc(cobj); + if (!desc) + goto bad; + s1 = desc; s2 = sig; + while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; } + if (*s1 != *s2) { + PyErr_Format(PyExc_TypeError, + "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", + PyModule_GetName(module), funcname, sig, desc); + goto bad; + } + tmp.p = PyCObject_AsVoidPtr(cobj);} +#endif + *f = tmp.fp; + if (!(*f)) + goto bad; + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(d); + return -1; +} +#endif + +/* InitStrings */ + static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { +#if PY_VERSION_HEX < 0x03030000 + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +#else + if (__Pyx_PyUnicode_READY(o) == -1) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (PyUnicode_IS_ASCII(o)) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +#endif + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } + #else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } + #endif +#else + res = PyNumber_Int(x); +#endif + if (res) { +#if PY_MAJOR_VERSION < 3 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/gensim/models/fasttext_inner.pyx b/gensim/models/fasttext_inner.pyx new file mode 100644 index 0000000000..09e75adba5 --- /dev/null +++ b/gensim/models/fasttext_inner.pyx @@ -0,0 +1,546 @@ +#!/usr/bin/env cython +# cython: boundscheck=False +# cython: wraparound=False +# cython: cdivision=True +# coding: utf-8 + +import cython +import numpy as np +cimport numpy as np + +from libc.math cimport exp +from libc.math cimport log +from libc.string cimport memset + +# scipy <= 0.15 +try: + from scipy.linalg.blas import fblas +except ImportError: + # in scipy > 0.15, fblas function has been removed + import scipy.linalg.blas as fblas + +from word2vec_inner cimport bisect_left, random_int32, \ + scopy, saxpy, sdot, dsdot, snrm2, sscal, \ + REAL_t, EXP_TABLE, \ + our_dot, our_saxpy, \ + our_dot_double, our_dot_float, our_dot_noblas, our_saxpy_noblas + +REAL = np.float32 + +DEF MAX_SENTENCE_LEN = 10000 +DEF MAX_SUBWORDS = 1000 + +DEF EXP_TABLE_SIZE = 1000 +DEF MAX_EXP = 6 + +cdef REAL_t[EXP_TABLE_SIZE] EXP_TABLE +cdef REAL_t[EXP_TABLE_SIZE] LOG_TABLE + +cdef int ONE = 1 +cdef REAL_t ONEF = 1.0 + + +cdef unsigned long long fast_sentence_sg_neg( + const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, + REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1neg, const int size, + const np.uint32_t word_index, const np.uint32_t *subwords_index, const np.uint32_t subwords_len, + const REAL_t alpha, REAL_t *work, REAL_t *l1, unsigned long long next_random, REAL_t *word_locks_vocab, + REAL_t *word_locks_ngrams) nogil: + + cdef long long a + cdef np.uint32_t word2_index = subwords_index[0] + cdef long long row1 = word2_index * size, row2 + cdef unsigned long long modulo = 281474976710655ULL + cdef REAL_t f, g, label, f_dot, log_e_f_dot + cdef np.uint32_t target_index + cdef int d + + memset(work, 0, size * cython.sizeof(REAL_t)) + memset(l1, 0, size * cython.sizeof(REAL_t)) + + scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + for d in range(1, subwords_len): + our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + cdef REAL_t norm_factor = ONEF / subwords_len + sscal(&size, &norm_factor, l1 , &ONE) + + for d in range(negative+1): + if d == 0: + target_index = word_index + label = ONEF + else: + target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + next_random = (next_random * 25214903917ULL + 11) & modulo + if target_index == word_index: + continue + label = 0.0 + + row2 = target_index * size + f_dot = our_dot(&size, l1, &ONE, &syn1neg[row2], &ONE) + if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + continue + f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + g = (label - f) * alpha + our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + our_saxpy(&size, &g, l1, &ONE, &syn1neg[row2], &ONE) + our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + for d in range(1, subwords_len): + our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) + return next_random + + +cdef void fast_sentence_sg_hs( + const np.uint32_t *word_point, const np.uint8_t *word_code, const int codelen, + REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1, const int size, + const np.uint32_t *subwords_index, const np.uint32_t subwords_len, + const REAL_t alpha, REAL_t *work, REAL_t *l1, REAL_t *word_locks_vocab, + REAL_t *word_locks_ngrams) nogil: + + cdef long long a, b + cdef np.uint32_t word2_index = subwords_index[0] + cdef long long row1 = word2_index * size, row2, sgn + cdef REAL_t f, g, f_dot, lprob + + memset(work, 0, size * cython.sizeof(REAL_t)) + memset(l1, 0, size * cython.sizeof(REAL_t)) + + scopy(&size, &syn0_vocab[row1], &ONE, l1, &ONE) + for d in range(1, subwords_len): + our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_index[d] * size], &ONE, l1, &ONE) + cdef REAL_t norm_factor = ONEF / subwords_len + sscal(&size, &norm_factor, l1 , &ONE) + + for b in range(codelen): + row2 = word_point[b] * size + f_dot = our_dot(&size, l1, &ONE, &syn1[row2], &ONE) + if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + continue + f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + g = (1 - word_code[b] - f) * alpha + + our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) + our_saxpy(&size, &g, l1, &ONE, &syn1[row2], &ONE) + + our_saxpy(&size, &word_locks_vocab[word2_index], work, &ONE, &syn0_vocab[row1], &ONE) + for d in range(1, subwords_len): + our_saxpy(&size, &word_locks_ngrams[subwords_index[d]], work, &ONE, &syn0_ngrams[subwords_index[d]*size], &ONE) + + +cdef unsigned long long fast_sentence_cbow_neg( + const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, int codelens[MAX_SENTENCE_LEN], + REAL_t *neu1, REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1neg, const int size, + const np.uint32_t indexes[MAX_SENTENCE_LEN], const np.uint32_t *subwords_idx[MAX_SENTENCE_LEN], + const int subwords_idx_len[MAX_SENTENCE_LEN], const REAL_t alpha, REAL_t *work, + int i, int j, int k, int cbow_mean, unsigned long long next_random, REAL_t *word_locks_vocab, REAL_t *word_locks_ngrams) nogil: + + cdef long long a + cdef long long row2 + cdef unsigned long long modulo = 281474976710655ULL + cdef REAL_t f, g, count, inv_count = 1.0, label, log_e_f_dot, f_dot + cdef np.uint32_t target_index, word_index + cdef int d, m + + word_index = indexes[i] + + memset(neu1, 0, size * cython.sizeof(REAL_t)) + count = 0.0 + for m in range(j, k): + if m == i: + continue + count += ONEF + our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + for d in range(subwords_idx_len[m]): + count += ONEF + our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + + if count > (0.5): + inv_count = ONEF / count + if cbow_mean: + sscal(&size, &inv_count, neu1, &ONE) + + memset(work, 0, size * cython.sizeof(REAL_t)) + + for d in range(negative+1): + if d == 0: + target_index = word_index + label = ONEF + else: + target_index = bisect_left(cum_table, (next_random >> 16) % cum_table[cum_table_len-1], 0, cum_table_len) + next_random = (next_random * 25214903917ULL + 11) & modulo + if target_index == word_index: + continue + label = 0.0 + + row2 = target_index * size + f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + continue + f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + g = (label - f) * alpha + + our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) + our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) + + if not cbow_mean: # divide error over summed window vectors + sscal(&size, &inv_count, work, &ONE) + + for m in range(j,k): + if m == i: + continue + our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + for d in range(subwords_idx_len[m]): + our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) + + return next_random + + +cdef void fast_sentence_cbow_hs( + const np.uint32_t *word_point, const np.uint8_t *word_code, int codelens[MAX_SENTENCE_LEN], + REAL_t *neu1, REAL_t *syn0_vocab, REAL_t *syn0_ngrams, REAL_t *syn1, const int size, + const np.uint32_t indexes[MAX_SENTENCE_LEN], const np.uint32_t *subwords_idx[MAX_SENTENCE_LEN], + const int subwords_idx_len[MAX_SENTENCE_LEN],const REAL_t alpha, REAL_t *work, + int i, int j, int k, int cbow_mean, REAL_t *word_locks_vocab, REAL_t *word_locks_ngrams) nogil: + + cdef long long a, b + cdef long long row2, sgn + cdef REAL_t f, g, count, inv_count = 1.0, f_dot, lprob + cdef int m + + memset(neu1, 0, size * cython.sizeof(REAL_t)) + count = 0.0 + for m in range(j, k): + if m == i: + continue + count += ONEF + our_saxpy(&size, &ONEF, &syn0_vocab[indexes[m] * size], &ONE, neu1, &ONE) + for d in range(subwords_idx_len[m]): + count += ONEF + our_saxpy(&size, &ONEF, &syn0_ngrams[subwords_idx[m][d] * size], &ONE, neu1, &ONE) + if count > (0.5): + inv_count = ONEF / count + if cbow_mean: + sscal(&size, &inv_count, neu1, &ONE) + + memset(work, 0, size * cython.sizeof(REAL_t)) + for b in range(codelens[i]): + row2 = word_point[b] * size + f_dot = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: + continue + f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + g = (1 - word_code[b] - f) * alpha + + our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) + our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) + + if not cbow_mean: # divide error over summed window vectors + sscal(&size, &inv_count, work, &ONE) + + for m in range(j,k): + if m == i: + continue + our_saxpy(&size, &word_locks_vocab[indexes[m]], work, &ONE, &syn0_vocab[indexes[m]*size], &ONE) + for d in range(subwords_idx_len[m]): + our_saxpy(&size, &word_locks_ngrams[subwords_idx[m][d]], work, &ONE, &syn0_ngrams[subwords_idx[m][d]*size], &ONE) + + +def train_batch_sg(model, sentences, alpha, _work, _l1): + cdef int hs = model.hs + cdef int negative = model.negative + cdef int sample = (model.sample != 0) + + cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) + + cdef REAL_t *work + cdef REAL_t *l1 + + cdef REAL_t _alpha = alpha + cdef int size = model.layer1_size + + cdef int codelens[MAX_SENTENCE_LEN] + cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + cdef np.uint32_t reduced_windows[MAX_SENTENCE_LEN] + cdef int sentence_idx[MAX_SENTENCE_LEN + 1] + cdef int window = model.window + + cdef int i, j, k + cdef int effective_words = 0, effective_sentences = 0 + cdef int sent_idx, idx_start, idx_end + + # For hierarchical softmax + cdef REAL_t *syn1 + cdef np.uint32_t *points[MAX_SENTENCE_LEN] + cdef np.uint8_t *codes[MAX_SENTENCE_LEN] + + # For negative sampling + cdef REAL_t *syn1neg + cdef np.uint32_t *cum_table + cdef unsigned long long cum_table_len + # for sampling (negative and frequent-word downsampling) + cdef unsigned long long next_random + + # For passing subwords information as C objects for nogil + cdef int subwords_idx_len[MAX_SENTENCE_LEN] + cdef np.uint32_t *subwords_idx[MAX_SENTENCE_LEN] + # dummy dictionary to ensure that the memory locations that subwords_idx point to + # are referenced throughout so that it isn't put back to free memory pool by Python's memory manager + subword_arrays = {} + + if hs: + syn1 = (np.PyArray_DATA(model.syn1)) + + if negative: + syn1neg = (np.PyArray_DATA(model.syn1neg)) + cum_table = (np.PyArray_DATA(model.cum_table)) + cum_table_len = len(model.cum_table) + if negative or sample: + next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + + # convert Python structures to primitive types, so we can release the GIL + work = np.PyArray_DATA(_work) + l1 = np.PyArray_DATA(_l1) + + # prepare C structures so we can go "full C" and release the Python GIL + vlookup = model.wv.vocab + sentence_idx[0] = 0 # indices of the first sentence always start at 0 + for sent in sentences: + if not sent: + continue # ignore empty sentences; leave effective_sentences unchanged + for token in sent: + word = vlookup[token] if token in vlookup else None + if word is None: + continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + if sample and word.sample_int < random_int32(&next_random): + continue + indexes[effective_words] = word.index + + subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + word_subwords = np.array([word.index] + subwords, dtype=np.uint32) + subwords_idx_len[effective_words] = (len(subwords) + 1) + subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + # ensures reference count of word_subwords doesn't reach 0 + subword_arrays[effective_words] = word_subwords + + if hs: + codelens[effective_words] = len(word.code) + codes[effective_words] = np.PyArray_DATA(word.code) + points[effective_words] = np.PyArray_DATA(word.point) + + effective_words += 1 + if effective_words == MAX_SENTENCE_LEN: + break + + # keep track of which words go into which sentence, so we don't train + # across sentence boundaries. + # indices of sentence number X are between idx_end: + k = idx_end + for j in range(j, k): + if j == i: + continue + if hs: + fast_sentence_sg_hs( + points[j], codes[j], codelens[j], syn0_vocab, syn0_ngrams, syn1, size, + subwords_idx[i], subwords_idx_len[i], _alpha, work, l1, word_locks_vocab, + word_locks_ngrams) + if negative: + next_random = fast_sentence_sg_neg( + negative, cum_table, cum_table_len, syn0_vocab, syn0_ngrams, syn1neg, size, + indexes[j], subwords_idx[i], subwords_idx_len[i], _alpha, work, l1, + next_random, word_locks_vocab, word_locks_ngrams) + + return effective_words + + +def train_batch_cbow(model, sentences, alpha, _work, _neu1): + cdef int hs = model.hs + cdef int negative = model.negative + cdef int sample = (model.sample != 0) + cdef int cbow_mean = model.cbow_mean + + cdef REAL_t *syn0_vocab = (np.PyArray_DATA(model.wv.syn0_vocab)) + cdef REAL_t *word_locks_vocab = (np.PyArray_DATA(model.syn0_vocab_lockf)) + cdef REAL_t *syn0_ngrams = (np.PyArray_DATA(model.wv.syn0_ngrams)) + cdef REAL_t *word_locks_ngrams = (np.PyArray_DATA(model.syn0_ngrams_lockf)) + + cdef REAL_t *work + cdef REAL_t _alpha = alpha + cdef int size = model.layer1_size + + cdef int codelens[MAX_SENTENCE_LEN] + cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + cdef np.uint32_t reduced_windows[MAX_SENTENCE_LEN] + cdef int sentence_idx[MAX_SENTENCE_LEN + 1] + cdef int window = model.window + + cdef int i, j, k + cdef int effective_words = 0, effective_sentences = 0 + cdef int sent_idx, idx_start, idx_end + + # For hierarchical softmax + cdef REAL_t *syn1 + cdef np.uint32_t *points[MAX_SENTENCE_LEN] + cdef np.uint8_t *codes[MAX_SENTENCE_LEN] + + # For negative sampling + cdef REAL_t *syn1neg + cdef np.uint32_t *cum_table + cdef unsigned long long cum_table_len + # for sampling (negative and frequent-word downsampling) + cdef unsigned long long next_random + + # For passing subwords information as C objects for nogil + cdef int subwords_idx_len[MAX_SENTENCE_LEN] + cdef np.uint32_t *subwords_idx[MAX_SENTENCE_LEN] + # dummy dictionary to ensure that the memory locations that subwords_idx point to + # are referenced throughout so that it isn't put back to free memory pool by Python's memory manager + subword_arrays = {} + + if hs: + syn1 = (np.PyArray_DATA(model.syn1)) + + if negative: + syn1neg = (np.PyArray_DATA(model.syn1neg)) + cum_table = (np.PyArray_DATA(model.cum_table)) + cum_table_len = len(model.cum_table) + if negative or sample: + next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) + + # convert Python structures to primitive types, so we can release the GIL + work = np.PyArray_DATA(_work) + neu1 = np.PyArray_DATA(_neu1) + + # prepare C structures so we can go "full C" and release the Python GIL + vlookup = model.wv.vocab + sentence_idx[0] = 0 # indices of the first sentence always start at 0 + for sent in sentences: + if not sent: + continue # ignore empty sentences; leave effective_sentences unchanged + for token in sent: + word = vlookup[token] if token in vlookup else None + if word is None: + continue # leaving `effective_words` unchanged = shortening the sentence = expanding the window + if sample and word.sample_int < random_int32(&next_random): + continue + indexes[effective_words] = word.index + + subwords = [model.wv.ngrams[subword_i] for subword_i in model.wv.ngrams_word[model.wv.index2word[word.index]]] + word_subwords = np.array(subwords, dtype=np.uint32) + subwords_idx_len[effective_words] = len(subwords) + subwords_idx[effective_words] = np.PyArray_DATA(word_subwords) + # ensures reference count of word_subwords doesn't reach 0 + subword_arrays[effective_words] = word_subwords + + if hs: + codelens[effective_words] = len(word.code) + codes[effective_words] = np.PyArray_DATA(word.code) + points[effective_words] = np.PyArray_DATA(word.point) + effective_words += 1 + if effective_words == MAX_SENTENCE_LEN: + break + + # keep track of which words go into which sentence, so we don't train + # across sentence boundaries. + # indices of sentence number X are between idx_end: + k = idx_end + + if hs: + fast_sentence_cbow_hs( + points[i], codes[i], codelens, neu1, syn0_vocab, syn0_ngrams, syn1, size,indexes, + subwords_idx,subwords_idx_len,_alpha, work, i, j, k, cbow_mean, word_locks_vocab, + word_locks_ngrams) + if negative: + next_random = fast_sentence_cbow_neg( + negative, cum_table, cum_table_len, codelens, neu1, syn0_vocab, syn0_ngrams, + syn1neg, size, indexes, subwords_idx, subwords_idx_len, _alpha, work, i, j, k, + cbow_mean, next_random, word_locks_vocab, word_locks_ngrams) + + return effective_words + + +def init(): + """ + Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + into table EXP_TABLE. Also calculate log(sigmoid(x)) into LOG_TABLE. + """ + global our_dot + global our_saxpy + + cdef int i + cdef float *x = [10.0] + cdef float *y = [0.01] + cdef float expected = 0.1 + cdef int size = 1 + cdef double d_res + cdef float *p_res + + # build the sigmoid table + for i in range(EXP_TABLE_SIZE): + EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) + EXP_TABLE[i] = (EXP_TABLE[i] / (EXP_TABLE[i] + 1)) + LOG_TABLE[i] = log( EXP_TABLE[i] ) + + # check whether sdot returns double or float + d_res = dsdot(&size, x, &ONE, y, &ONE) + p_res = &d_res + if (abs(d_res - expected) < 0.0001): + our_dot = our_dot_double + our_saxpy = saxpy + return 0 # double + elif (abs(p_res[0] - expected) < 0.0001): + our_dot = our_dot_float + our_saxpy = saxpy + return 1 # float + else: + # neither => use cython loops, no BLAS + # actually, the BLAS is so messed up we'll probably have segfaulted above and never even reach here + our_dot = our_dot_noblas + our_saxpy = our_saxpy_noblas + return 2 + +FAST_VERSION = init() # initialize the module +MAX_WORDS_IN_BATCH = MAX_SENTENCE_LEN + diff --git a/gensim/models/hdpmodel.py b/gensim/models/hdpmodel.py index 884d6d01ed..09239fa605 100755 --- a/gensim/models/hdpmodel.py +++ b/gensim/models/hdpmodel.py @@ -446,9 +446,8 @@ def show_topic(self, topic_id, topn=20, log=False, formatted=False, num_words=No """ if num_words is not None: # deprecated num_words is used - logger.warning( - "The parameter num_words for show_topic() would be deprecated in the updated version. " - "Please use topn instead." + warnings.warn( + "The parameter `num_words` is deprecated, will be removed in 4.0.0, please use `topn` instead." ) topn = num_words @@ -631,8 +630,7 @@ def show_topics(self, num_topics=10, num_words=10, log=False, formatted=True): def print_topic(self, topic_id, topn=None, num_words=None): if num_words is not None: # deprecated num_words is used warnings.warn( - "The parameter num_words for print_topic() would be deprecated in the updated version. " - "Please use topn instead." + "The parameter `num_words` is deprecated, will be removed in 4.0.0, please use `topn` instead." ) topn = num_words @@ -641,8 +639,7 @@ def print_topic(self, topic_id, topn=None, num_words=None): def show_topic(self, topic_id, topn=20, log=False, formatted=False, num_words=None,): if num_words is not None: # deprecated num_words is used warnings.warn( - "The parameter num_words for show_topic() would be deprecated in the updated version. " - "Please use topn instead." + "The parameter `num_words` is deprecated, will be removed in 4.0.0, please use `topn` instead." ) topn = num_words diff --git a/gensim/models/keyedvectors.py b/gensim/models/keyedvectors.py index 6b9ebc3145..5c3d3f55bc 100644 --- a/gensim/models/keyedvectors.py +++ b/gensim/models/keyedvectors.py @@ -75,6 +75,7 @@ double, array, vstack, fromstring, sqrt, newaxis,\ ndarray, sum as np_sum, prod, ascontiguousarray,\ argmax +import numpy as np from gensim import utils, matutils # utility fnc for pickling, common scipy operations etc from gensim.corpora.dictionary import Dictionary @@ -105,28 +106,18 @@ def __str__(self): return "%s(%s)" % (self.__class__.__name__, ', '.join(vals)) -class KeyedVectors(utils.SaveLoad): +class KeyedVectorsBase(utils.SaveLoad): """ - Class to contain vectors and vocab for the Word2Vec training class and other w2v methods not directly - involved in training such as most_similar() + Base class to contain vectors and vocab for any set of vectors which are each associated with a key. + """ def __init__(self): self.syn0 = [] - self.syn0norm = None self.vocab = {} self.index2word = [] self.vector_size = None - @property - def wv(self): - return self - - def save(self, *args, **kwargs): - # don't bother storing the cached normalized vectors - kwargs['ignore'] = kwargs.get('ignore', ['syn0norm']) - super(KeyedVectors, self).save(*args, **kwargs) - def save_word2vec_format(self, fname, fvocab=None, binary=False, total_vec=None): """ Store the input-hidden weight matrix in the same format used by the original @@ -265,6 +256,178 @@ def add_word(word, weights): logger.info("loaded %s matrix from %s", result.syn0.shape, fname) return result + def similarity(self, w1, w2): + """ + Compute similarity between vectors of two input words. + To be implemented by child class. + + """ + raise NotImplementedError + + def distance(self, w1, w2): + """ + Compute distance between vectors of two input words. + To be implemented by child class. + + """ + raise NotImplementedError + + def distances(self, word_or_vector, other_words=()): + """ + Compute distances from given word or vector to all words in `other_words`. + If `other_words` is empty, return distance between `word_or_vectors` and all words in vocab. + To be implemented by child class. + + """ + raise NotImplementedError + + def word_vec(self, word): + """ + Accept a single word as input. + Returns the word's representations in vector space, as a 1D numpy array. + + Example:: + + >>> trained_model.word_vec('office') + array([ -1.40128313e-02, ...]) + + """ + if word in self.vocab: + result = self.syn0[self.vocab[word].index] + result.setflags(write=False) + return result + else: + raise KeyError("word '%s' not in vocabulary" % word) + + def __getitem__(self, words): + """ + Accept a single word or a list of words as input. + + If a single word: returns the word's representations in vector space, as + a 1D numpy array. + + Multiple words: return the words' representations in vector space, as a + 2d numpy array: #words x #vector_size. Matrix rows are in the same order + as in input. + + Example:: + + >>> trained_model['office'] + array([ -1.40128313e-02, ...]) + + >>> trained_model[['office', 'products']] + array([ -1.40128313e-02, ...] + [ -1.70425311e-03, ...] + ...) + + """ + if isinstance(words, string_types): + # allow calls like trained_model['office'], as a shorthand for trained_model[['office']] + return self.word_vec(words) + + return vstack([self.word_vec(word) for word in words]) + + def __contains__(self, word): + return word in self.vocab + + def most_similar_to_given(self, w1, word_list): + """Return the word from word_list most similar to w1. + + Args: + w1 (str): a word + word_list (list): list of words containing a word most similar to w1 + + Returns: + the word in word_list with the highest similarity to w1 + + Raises: + KeyError: If w1 or any word in word_list is not in the vocabulary + + Example:: + + >>> trained_model.most_similar_to_given('music', ['water', 'sound', 'backpack', 'mouse']) + 'sound' + + >>> trained_model.most_similar_to_given('snake', ['food', 'pencil', 'animal', 'phone']) + 'animal' + + """ + return word_list[argmax([self.similarity(w1, word) for word in word_list])] + + def words_closer_than(self, w1, w2): + """ + Returns all words that are closer to `w1` than `w2` is to `w1`. + + Parameters + ---------- + w1 : str + Input word. + w2 : str + Input word. + + Returns + ------- + list (str) + List of words that are closer to `w1` than `w2` is to `w1`. + + Examples + -------- + + >>> model.words_closer_than('carnivore.n.01', 'mammal.n.01') + ['dog.n.01', 'canine.n.02'] + + """ + all_distances = self.distances(w1) + w1_index = self.vocab[w1].index + w2_index = self.vocab[w2].index + closer_node_indices = np.where(all_distances < all_distances[w2_index])[0] + return [self.index2word[index] for index in closer_node_indices if index != w1_index] + + def rank(self, w1, w2): + """ + Rank of the distance of `w2` from `w1`, in relation to distances of all words from `w1`. + + Parameters + ---------- + w1 : str + Input word. + w2 : str + Input word. + + Returns + ------- + int + Rank of `w2` from `w1` in relation to all other nodes. + + Examples + -------- + + >>> model.rank('mammal.n.01', 'carnivore.n.01') + 3 + + """ + return len(self.words_closer_than(w1, w2)) + 1 + + +class EuclideanKeyedVectors(KeyedVectorsBase): + """ + Class to contain vectors and vocab for the Word2Vec training class and other w2v methods not directly + involved in training such as most_similar() + """ + + def __init__(self): + super(EuclideanKeyedVectors, self).__init__() + self.syn0norm = None + + @property + def wv(self): + return self + + def save(self, *args, **kwargs): + # don't bother storing the cached normalized vectors + kwargs['ignore'] = kwargs.get('ignore', ['syn0norm']) + super(EuclideanKeyedVectors, self).save(*args, **kwargs) + def word_vec(self, word, use_norm=False): """ Accept a single word as input. @@ -358,6 +521,44 @@ def most_similar(self, positive=None, negative=None, topn=10, restrict_vocab=Non result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] return result[:topn] + def similar_by_word(self, word, topn=10, restrict_vocab=None): + """ + Find the top-N most similar words. + + If topn is False, similar_by_word returns the vector of similarity scores. + + `restrict_vocab` is an optional integer which limits the range of vectors which + are searched for most-similar values. For example, restrict_vocab=10000 would + only check the first 10000 word vectors in the vocabulary order. (This may be + meaningful if you've sorted the vocabulary by descending frequency.) + + Example:: + + >>> trained_model.similar_by_word('graph') + [('user', 0.9999163150787354), ...] + + """ + return self.most_similar(positive=[word], topn=topn, restrict_vocab=restrict_vocab) + + def similar_by_vector(self, vector, topn=10, restrict_vocab=None): + """ + Find the top-N most similar words by vector. + + If topn is False, similar_by_vector returns the vector of similarity scores. + + `restrict_vocab` is an optional integer which limits the range of vectors which + are searched for most-similar values. For example, restrict_vocab=10000 would + only check the first 10000 word vectors in the vocabulary order. (This may be + meaningful if you've sorted the vocabulary by descending frequency.) + + Example:: + + >>> trained_model.similar_by_vector([1,2]) + [('survey', 0.9942699074745178), ...] + + """ + return self.most_similar(positive=[vector], topn=topn, restrict_vocab=restrict_vocab) + def wmdistance(self, document1, document2): """ Compute the Word Mover's Distance between two documents. When using this @@ -513,46 +714,6 @@ def most_similar_cosmul(self, positive=None, negative=None, topn=10): result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] return result[:topn] - def similar_by_word(self, word, topn=10, restrict_vocab=None): - """ - Find the top-N most similar words. - - If topn is False, similar_by_word returns the vector of similarity scores. - - `restrict_vocab` is an optional integer which limits the range of vectors which - are searched for most-similar values. For example, restrict_vocab=10000 would - only check the first 10000 word vectors in the vocabulary order. (This may be - meaningful if you've sorted the vocabulary by descending frequency.) - - Example:: - - >>> trained_model.similar_by_word('graph') - [('user', 0.9999163150787354), ...] - - """ - - return self.most_similar(positive=[word], topn=topn, restrict_vocab=restrict_vocab) - - def similar_by_vector(self, vector, topn=10, restrict_vocab=None): - """ - Find the top-N most similar words by vector. - - If topn is False, similar_by_vector returns the vector of similarity scores. - - `restrict_vocab` is an optional integer which limits the range of vectors which - are searched for most-similar values. For example, restrict_vocab=10000 would - only check the first 10000 word vectors in the vocabulary order. (This may be - meaningful if you've sorted the vocabulary by descending frequency.) - - Example:: - - >>> trained_model.similar_by_vector([1,2]) - [('survey', 0.9942699074745178), ...] - - """ - - return self.most_similar(positive=[vector], topn=topn, restrict_vocab=restrict_vocab) - def doesnt_match(self, words): """ Which word from the given list doesn't go with the others? @@ -576,36 +737,83 @@ def doesnt_match(self, words): dists = dot(vectors, mean) return sorted(zip(dists, used_words))[0][1] - def __getitem__(self, words): + @staticmethod + def cosine_similarities(vector_1, vectors_all): """ - Accept a single word or a list of words as input. + Return cosine similarities between one vector and a set of other vectors. + + Parameters + ---------- + vector_1 : numpy.array + vector from which similarities are to be computed. + expected shape (dim,) + vectors_all : numpy.array + for each row in vectors_all, distance from vector_1 is computed. + expected shape (num_vectors, dim) + + Returns + ------- + numpy.array + Contains cosine distance between vector_1 and each row in vectors_all. + shape (num_vectors,) - If a single word: returns the word's representations in vector space, as - a 1D numpy array. + """ + norm = np.linalg.norm(vector_1) + all_norms = np.linalg.norm(vectors_all, axis=1) + dot_products = dot(vectors_all, vector_1) + similarities = dot_products / (norm * all_norms) + return similarities - Multiple words: return the words' representations in vector space, as a - 2d numpy array: #words x #vector_size. Matrix rows are in the same order - as in input. + def distances(self, word_or_vector, other_words=()): + """ + Compute cosine distances from given word or vector to all words in `other_words`. + If `other_words` is empty, return distance between `word_or_vectors` and all words in vocab. - Example:: + Parameters + ---------- + word_or_vector : str or numpy.array + Word or vector from which distances are to be computed. - >>> trained_model['office'] - array([ -1.40128313e-02, ...]) + other_words : iterable(str) or None + For each word in `other_words` distance from `word_or_vector` is computed. + If None or empty, distance of `word_or_vector` from all words in vocab is computed (including itself). - >>> trained_model[['office', 'products']] - array([ -1.40128313e-02, ...] - [ -1.70425311e-03, ...] - ...) + Returns + ------- + numpy.array + Array containing distances to all words in `other_words` from input `word_or_vector`, + in the same order as `other_words`. + + Notes + ----- + Raises KeyError if either `word_or_vector` or any word in `other_words` is absent from vocab. """ - if isinstance(words, string_types): - # allow calls like trained_model['office'], as a shorthand for trained_model[['office']] - return self.word_vec(words) + if isinstance(word_or_vector, string_types): + input_vector = self.word_vec(word_or_vector) + else: + input_vector = word_or_vector + if not other_words: + other_vectors = self.syn0 + else: + other_indices = [self.vocab[word].index for word in other_words] + other_vectors = self.syn0[other_indices] + return 1 - self.cosine_similarities(input_vector, other_vectors) - return vstack([self.word_vec(word) for word in words]) + def distance(self, w1, w2): + """ + Compute cosine distance between two words. - def __contains__(self, word): - return word in self.vocab + Example:: + + >>> trained_model.distance('woman', 'man') + 0.34 + + >>> trained_model.distance('woman', 'woman') + 0.0 + + """ + return 1 - self.similarity(w1, w2) def similarity(self, w1, w2): """ @@ -622,30 +830,6 @@ def similarity(self, w1, w2): """ return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2])) - def most_similar_to_given(self, w1, word_list): - """Return the word from word_list most similar to w1. - - Args: - w1 (str): a word - word_list (list): list of words containing a word most similar to w1 - - Returns: - the word in word_list with the highest similarity to w1 - - Raises: - KeyError: If w1 or any word in word_list is not in the vocabulary - - Example:: - - >>> trained_model.most_similar_to_given('music', ['water', 'sound', 'backpack', 'mouse']) - 'sound' - - >>> trained_model.most_similar_to_given('snake', ['food', 'pencil', 'animal', 'phone']) - 'animal' - - """ - return word_list[argmax([self.similarity(w1, word) for word in word_list])] - def n_similarity(self, ws1, ws2): """ Compute cosine similarity between two sets of words. @@ -878,3 +1062,7 @@ def get_keras_embedding(self, train_embeddings=False): weights=[weights], trainable=train_embeddings ) return layer + + +# For backward compatibility +KeyedVectors = EuclideanKeyedVectors diff --git a/gensim/models/ldamodel.py b/gensim/models/ldamodel.py index 1b50f0a9b8..41d652f3a9 100755 --- a/gensim/models/ldamodel.py +++ b/gensim/models/ldamodel.py @@ -47,15 +47,42 @@ from gensim.models import basemodel, CoherenceModel from gensim.models.callbacks import Callback -# log(sum(exp(x))) that tries to avoid overflow -try: - from scipy.special import logsumexp -except ImportError: - from scipy.misc import logsumexp - logger = logging.getLogger('gensim.models.ldamodel') +DTYPE_TO_EPS = { + np.float16: 1e-5, + np.float32: 1e-35, + np.float64: 1e-100, +} + + +def logsumexp(x): + """Log of sum of exponentials + + Parameters + ---------- + x : array_like + Input data + + Returns + ------- + float + log of sum of exponentials of elements in `x` + + Notes + ----- + for performance, does not support NaNs or > 1d arrays like + scipy.special.logsumexp() + + """ + + x_max = np.max(x) + x = np.log(np.sum(np.exp(x - x_max))) + x += x_max + + return x + def update_dir_prior(prior, N, logphat, rho): """ @@ -254,6 +281,7 @@ def __init__(self, corpus=None, num_topics=100, id2word=None, `callbacks` a list of metric callbacks to log/visualize evaluation metrics of topic model during training. `dtype` is data-type to use during calculations inside model. All inputs are also converted to this dtype. + Available types: `numpy.float16`, `numpy.float32`, `numpy.float64`. Example: @@ -265,6 +293,11 @@ def __init__(self, corpus=None, num_topics=100, id2word=None, >>> lda = LdaModel(corpus, num_topics=50, alpha='auto', eval_every=5) # train asymmetric alpha from data """ + if dtype not in DTYPE_TO_EPS: + raise ValueError( + "Incorrect 'dtype', please choose one of {}".format( + ", ".join("numpy.{}".format(tp.__name__) for tp in sorted(DTYPE_TO_EPS)))) + self.dtype = dtype # store user-supplied parameters @@ -476,8 +509,9 @@ def inference(self, chunk, collect_sstats=False): # The optimal phi_{dwk} is proportional to expElogthetad_k * expElogbetad_w. # phinorm is the normalizer. - # TODO treat zeros explicitly, instead of adding 1e-100? - phinorm = np.dot(expElogthetad, expElogbetad) + 1e-100 + # TODO treat zeros explicitly, instead of adding epsilon? + eps = DTYPE_TO_EPS[self.dtype] + phinorm = np.dot(expElogthetad, expElogbetad) + eps # Iterate between gamma and phi until convergence for _ in xrange(self.iterations): @@ -488,7 +522,7 @@ def inference(self, chunk, collect_sstats=False): gammad = self.alpha + expElogthetad * np.dot(cts / phinorm, expElogbetad.T) Elogthetad = dirichlet_expectation(gammad) expElogthetad = np.exp(Elogthetad) - phinorm = np.dot(expElogthetad, expElogbetad) + 1e-100 + phinorm = np.dot(expElogthetad, expElogbetad) + eps # If gamma hasn't changed much, we're done. meanchange = np.mean(abs(gammad - lastgamma)) if meanchange < self.gamma_threshold: diff --git a/gensim/models/phrases.py b/gensim/models/phrases.py index 2f2b2c4b9a..973eee9be5 100644 --- a/gensim/models/phrases.py +++ b/gensim/models/phrases.py @@ -178,7 +178,46 @@ def analyze_sentence(self, sentence, threshold, common_terms, scorer): yield (word, None) -class Phrases(SentenceAnalyzer, interfaces.TransformationABC): +class PhrasesTransformation(interfaces.TransformationABC): + + @classmethod + def load(cls, *args, **kwargs): + """ + Load a previously saved Phrases/Phraser class. Handles backwards compatibility from + older Phrases/Phraser versions which did not support pluggable scoring functions. + Otherwise, relies on utils.load + """ + + model = super(PhrasesTransformation, cls).load(*args, **kwargs) + # update older models + # if no scoring parameter, use default scoring + if not hasattr(model, 'scoring'): + logger.info('older version of %s loaded without scoring function', cls.__name__) + logger.info('setting pluggable scoring method to original_scorer for compatibility') + model.scoring = original_scorer + # if there is a scoring parameter, and it's a text value, load the proper scoring function + if hasattr(model, 'scoring'): + if isinstance(model.scoring, six.string_types): + if model.scoring == 'default': + logger.info('older version of %s loaded with "default" scoring parameter', cls.__name__) + logger.info('setting scoring method to original_scorer pluggable scoring method for compatibility') + model.scoring = original_scorer + elif model.scoring == 'npmi': + logger.info('older version of %s loaded with "npmi" scoring parameter', cls.__name__) + logger.info('setting scoring method to npmi_scorer pluggable scoring method for compatibility') + model.scoring = npmi_scorer + else: + raise ValueError( + 'failed to load %s model with unknown scoring setting %s' % (cls.__name__, model.scoring)) + # if there is non common_terms attribute, initialize + if not hasattr(model, "common_terms"): + logger.info('older version of %s loaded without common_terms attribute', cls.__name__) + logger.info('setting common_terms to empty set') + model.common_terms = frozenset() + return model + + +class Phrases(SentenceAnalyzer, PhrasesTransformation): """ Detect phrases, based on collected collocation counts. Adjacent words that appear together more frequently than expected are joined together with the `_` character. @@ -303,6 +342,19 @@ def __init__(self, sentences=None, min_count=5, threshold=10.0, if sentences is not None: self.add_vocab(sentences) + @classmethod + def load(cls, *args, **kwargs): + """ + Load a previously saved Phrases class. Handles backwards compatibility from + older Phrases versions which did not support pluggable scoring functions. + """ + model = super(Phrases, cls).load(*args, **kwargs) + if not hasattr(model, 'corpus_word_count'): + logger.info('older version of %s loaded without corpus_word_count', cls.__name__) + logger.info('Setting it to 0, do not use it in your scoring function.') + model.corpus_word_count = 0 + return model + def __str__(self): """Get short string representation of this phrase detector.""" return "%s<%i vocab, min_count=%s, threshold=%s, max_vocab_size=%s>" % ( @@ -461,41 +513,6 @@ def __getitem__(self, sentence): return [utils.to_unicode(w) for w in new_s] - @classmethod - def load(cls, *args, **kwargs): - """ - Load a previously saved Phrases class. Handles backwards compatibility from - older Phrases versions which did not support pluggable scoring functions. Otherwise, relies on utils.load - """ - - # for python 2 and 3 compatibility. basestring is used to check if model.scoring is a string - try: - basestring - except NameError: - basestring = str - - model = super(Phrases, cls).load(*args, **kwargs) - # update older models - # if no scoring parameter, use default scoring - if not hasattr(model, 'scoring'): - logger.info('older version of Phrases loaded without scoring function') - logger.info('setting pluggable scoring method to original_scorer for compatibility') - model.scoring = original_scorer - # if there is a scoring parameter, and it's a text value, load the proper scoring function - if hasattr(model, 'scoring'): - if isinstance(model.scoring, basestring): - if model.scoring == 'default': - logger.info('older version of Phrases loaded with "default" scoring parameter') - logger.info('setting scoring method to original_scorer pluggable scoring method for compatibility') - model.scoring = original_scorer - elif model.scoring == 'npmi': - logger.info('older version of Phrases loaded with "npmi" scoring parameter') - logger.info('setting scoring method to npmi_scorer pluggable scoring method for compatibility') - model.scoring = npmi_scorer - else: - raise ValueError('failed to load Phrases model with unknown scoring setting %s' % (model.scoring)) - return model - # these two built-in scoring methods don't cast everything to float because the casting is done in the call # to the scoring method in __getitem__ and export_phrases. @@ -530,7 +547,7 @@ def pseudocorpus(source_vocab, sep, common_terms=frozenset()): yield components -class Phraser(SentenceAnalyzer, interfaces.TransformationABC): +class Phraser(SentenceAnalyzer, PhrasesTransformation): """ Minimal state & functionality to apply results of a Phrases model to tokens. diff --git a/gensim/models/poincare.py b/gensim/models/poincare.py new file mode 100644 index 0000000000..921e7e74f6 --- /dev/null +++ b/gensim/models/poincare.py @@ -0,0 +1,1602 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Author: Jayant Jain +# Copyright (C) 2017 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + + +"""Python implementation of Poincaré Embeddings [1]_, an embedding that is better at capturing latent hierarchical +information than traditional Euclidean embeddings. The method is described in more detail in [1]_. + +The main use-case is to automatically learn hierarchical representations of nodes from a tree-like structure, +such as a Directed Acyclic Graph, using a transitive closure of the relations. Representations of nodes in a +symmetric graph can also be learned, using an iterable of the direct relations in the graph. + +This module allows training a Poincaré Embedding from a training file containing relations of graph in a +csv-like format, or a Python iterable of relations. + +.. [1] Maximilian Nickel, Douwe Kiela - "Poincaré Embeddings for Learning Hierarchical Representations" + https://arxiv.org/abs/1705.08039 + +Examples +-------- +Initialize and train a model from a list: + +>>> from gensim.models.poincare import PoincareModel +>>> relations = [('kangaroo', 'marsupial'), ('kangaroo', 'mammal'), ('gib', 'cat')] +>>> model = PoincareModel(relations, negative=2) +>>> model.train(epochs=50) + +Initialize and train a model from a file containing one relation per line: + +>>> from gensim.models.poincare import PoincareModel, PoincareRelations +>>> from gensim.test.utils import datapath +>>> file_path = datapath('poincare_hypernyms.tsv') +>>> model = PoincareModel(PoincareRelations(file_path), negative=2) +>>> model.train(epochs=50) + +""" + + +import csv +import logging +import sys +import time + +import numpy as np +from collections import defaultdict, Counter +from numpy import random as np_random +from scipy.stats import spearmanr +from six import string_types +from smart_open import smart_open + +from gensim import utils, matutils +from gensim.models.keyedvectors import KeyedVectorsBase, Vocab + +try: + from autograd import grad # Only required for optionally verifying gradients while training + from autograd import numpy as grad_np + AUTOGRAD_PRESENT = True +except ImportError: + AUTOGRAD_PRESENT = False + +logger = logging.getLogger(__name__) + + +class PoincareModel(utils.SaveLoad): + """Class for training, using and evaluating Poincare Embeddings. + + The model can be stored/loaded via its :meth:`~gensim.models.poincare.PoincareModel.save` + and :meth:`~gensim.models.poincare.PoincareModel.load` methods, or stored/loaded in the word2vec format + via `model.kv.save_word2vec_format` and :meth:`~gensim.models.poincare.PoincareKeyedVectors.load_word2vec_format`. + + Note that training cannot be resumed from a model loaded via `load_word2vec_format`, if you wish to train further, + use :meth:`~gensim.models.poincare.PoincareModel.save` and :meth:`~gensim.models.poincare.PoincareModel.load` + methods instead. + + """ + def __init__(self, train_data, size=50, alpha=0.1, negative=10, workers=1, epsilon=1e-5, regularization_coeff=1.0, + burn_in=10, burn_in_alpha=0.01, init_range=(-0.001, 0.001), dtype=np.float64, seed=0): + """Initialize and train a Poincare embedding model from an iterable of relations. + + Parameters + ---------- + train_data : iterable of (str, str) + Iterable of relations, e.g. a list of tuples, or a PoincareRelations instance streaming from a file. + Note that the relations are treated as ordered pairs, i.e. a relation (a, b) does not imply the + opposite relation (b, a). In case the relations are symmetric, the data should contain both relations + (a, b) and (b, a). + size : int, optional + Number of dimensions of the trained model. + alpha : float, optional + Learning rate for training. + negative : int, optional + Number of negative samples to use. + workers : int, optional + Number of threads to use for training the model. + epsilon : float, optional + Constant used for clipping embeddings below a norm of one. + regularization_coeff : float, optional + Coefficient used for l2-regularization while training (0 effectively disables regularization). + burn_in : int, optional + Number of epochs to use for burn-in initialization (0 means no burn-in). + burn_in_alpha : float, optional + Learning rate for burn-in initialization, ignored if `burn_in` is 0. + init_range : 2-tuple (float, float) + Range within which the vectors are randomly initialized. + dtype : numpy.dtype + The numpy dtype to use for the vectors in the model (numpy.float64, numpy.float32 etc). + Using lower precision floats may be useful in increasing training speed and reducing memory usage. + seed : int, optional + Seed for random to ensure reproducibility. + + Examples + -------- + Initialize a model from a list: + + >>> from gensim.models.poincare import PoincareModel + >>> relations = [('kangaroo', 'marsupial'), ('kangaroo', 'mammal'), ('gib', 'cat')] + >>> model = PoincareModel(relations, negative=2) + + Initialize a model from a file containing one relation per line: + + >>> from gensim.models.poincare import PoincareModel, PoincareRelations + >>> from gensim.test.utils import datapath + >>> file_path = datapath('poincare_hypernyms.tsv') + >>> model = PoincareModel(PoincareRelations(file_path), negative=2) + + See :class:`~gensim.models.poincare.PoincareRelations` for more options. + + """ + self.train_data = train_data + self.kv = PoincareKeyedVectors() + self.size = size + self.train_alpha = alpha # Learning rate for training + self.burn_in_alpha = burn_in_alpha # Learning rate for burn-in + self.alpha = alpha # Current learning rate + self.negative = negative + self.workers = workers + self.epsilon = epsilon + self.regularization_coeff = regularization_coeff + self.burn_in = burn_in + self._burn_in_done = False + self.dtype = dtype + self.seed = seed + self._np_random = np_random.RandomState(seed) + self.init_range = init_range + self._loss_grad = None + self._load_relations() + self._init_embeddings() + + def _load_relations(self): + """Load relations from the train data and build vocab.""" + vocab = {} + index2word = [] + all_relations = [] # List of all relation pairs + node_relations = defaultdict(set) # Mapping from node index to its related node indices + + logger.info("Loading relations from train data..") + for relation in self.train_data: + if len(relation) != 2: + raise ValueError('Relation pair "%s" should have exactly two items' % repr(relation)) + for item in relation: + if item in vocab: + vocab[item].count += 1 + else: + vocab[item] = Vocab(count=1, index=len(index2word)) + index2word.append(item) + node_1, node_2 = relation + node_1_index, node_2_index = vocab[node_1].index, vocab[node_2].index + node_relations[node_1_index].add(node_2_index) + relation = (node_1_index, node_2_index) + all_relations.append(relation) + logger.info("Loaded %d relations from train data, %d nodes", len(all_relations), len(vocab)) + self.kv.vocab = vocab + self.kv.index2word = index2word + self.indices_set = set((range(len(index2word)))) # Set of all node indices + self.indices_array = np.array(range(len(index2word))) # Numpy array of all node indices + counts = np.array([self.kv.vocab[index2word[i]].count for i in range(len(index2word))], dtype=np.float64) + self._node_probabilities = counts / counts.sum() + self._node_probabilities_cumsum = np.cumsum(self._node_probabilities) + self.all_relations = all_relations + self.node_relations = node_relations + self._negatives_buffer = NegativesBuffer([]) # Buffer for negative samples, to reduce calls to sampling method + self._negatives_buffer_size = 2000 + + def _init_embeddings(self): + """Randomly initialize vectors for the items in the vocab.""" + shape = (len(self.kv.index2word), self.size) + self.kv.syn0 = self._np_random.uniform(self.init_range[0], self.init_range[1], shape).astype(self.dtype) + + def _get_candidate_negatives(self): + """Returns candidate negatives of size `self.negative` from the negative examples buffer. + + Returns + ------- + numpy.array + Array of shape (`self.negative`,) containing indices of negative nodes. + + """ + + if self._negatives_buffer.num_items() < self.negative: + # Note: np.random.choice much slower than random.sample for large populations, possible bottleneck + uniform_numbers = self._np_random.random_sample(self._negatives_buffer_size) + cumsum_table_indices = np.searchsorted(self._node_probabilities_cumsum, uniform_numbers) + self._negatives_buffer = NegativesBuffer(cumsum_table_indices) + return self._negatives_buffer.get_items(self.negative) + + def _sample_negatives(self, node_index): + """Return a sample of negatives for the given node. + + Parameters + ---------- + node_index : int + Index of the positive node for which negative samples are to be returned. + + Returns + ------- + numpy.array + Array of shape (self.negative,) containing indices of negative nodes for the given node index. + + """ + node_relations = self.node_relations[node_index] + num_remaining_nodes = len(self.kv.vocab) - len(node_relations) + if num_remaining_nodes < self.negative: + raise ValueError( + 'Cannot sample %d negative nodes from a set of %d negative nodes for %s' % + (self.negative, num_remaining_nodes, self.kv.index2word[node_index]) + ) + + positive_fraction = float(len(node_relations)) / len(self.kv.vocab) + if positive_fraction < 0.01: + # If number of positive relations is a small fraction of total nodes + # re-sample till no positively connected nodes are chosen + indices = self._get_candidate_negatives() + unique_indices = set(indices) + times_sampled = 1 + while (len(indices) != len(unique_indices)) or (unique_indices & node_relations): + times_sampled += 1 + indices = self._get_candidate_negatives() + unique_indices = set(indices) + if times_sampled > 1: + logger.debug('Sampled %d times, positive fraction %.5f', times_sampled, positive_fraction) + else: + # If number of positive relations is a significant fraction of total nodes + # subtract positively connected nodes from set of choices and sample from the remaining + valid_negatives = np.array(list(self.indices_set - node_relations)) + probs = self._node_probabilities[valid_negatives] + probs /= probs.sum() + indices = self._np_random.choice(valid_negatives, size=self.negative, p=probs, replace=False) + + return list(indices) + + @staticmethod + def _loss_fn(matrix, regularization_coeff=1.0): + """Given a numpy array with vectors for u, v and negative samples, computes loss value. + + Parameters + ---------- + matrix : numpy.array + Array containing vectors for u, v and negative samples, of shape (2 + negative_size, dim). + regularization_coeff : float + Coefficient to use for l2-regularization + + Returns + ------- + float + Computed loss value. + + Warnings + -------- + Only used for autograd gradients, since autograd requires a specific function signature. + + """ + vector_u = matrix[0] + vectors_v = matrix[1:] + euclidean_dists = grad_np.linalg.norm(vector_u - vectors_v, axis=1) + norm = grad_np.linalg.norm(vector_u) + all_norms = grad_np.linalg.norm(vectors_v, axis=1) + poincare_dists = grad_np.arccosh( + 1 + 2 * ( + (euclidean_dists ** 2) / ((1 - norm ** 2) * (1 - all_norms ** 2)) + ) + ) + exp_negative_distances = grad_np.exp(-poincare_dists) + regularization_term = regularization_coeff * grad_np.linalg.norm(vectors_v[0]) ** 2 + return -grad_np.log(exp_negative_distances[0] / (exp_negative_distances.sum())) + regularization_term + + @staticmethod + def _clip_vectors(vectors, epsilon): + """Clip vectors to have a norm of less than one. + + Parameters + ---------- + vectors : numpy.array + Can be 1-D,or 2-D (in which case the norm for each row is checked). + epsilon : float + Parameter for numerical stability, each dimension of the vector is reduced by `epsilon` + if the norm of the vector is greater than or equal to 1. + + Returns + ------- + numpy.array + Array with norms clipped below 1. + + """ + one_d = len(vectors.shape) == 1 + threshold = 1 - epsilon + if one_d: + norm = np.linalg.norm(vectors) + if norm < threshold: + return vectors + else: + return vectors / norm - (np.sign(vectors) * epsilon) + else: + norms = np.linalg.norm(vectors, axis=1) + if (norms < threshold).all(): + return vectors + else: + vectors[norms >= threshold] *= (threshold / norms[norms >= threshold])[:, np.newaxis] + vectors[norms >= threshold] -= np.sign(vectors[norms >= threshold]) * epsilon + return vectors + + def save(self, *args, **kwargs): + """Save complete model to disk, inherited from :class:`gensim.utils.SaveLoad`.""" + self._loss_grad = None # Can't pickle autograd fn to disk + super(PoincareModel, self).save(*args, **kwargs) + + @classmethod + def load(cls, *args, **kwargs): + """Load model from disk, inherited from :class:`~gensim.utils.SaveLoad`.""" + model = super(PoincareModel, cls).load(*args, **kwargs) + return model + + def _prepare_training_batch(self, relations, all_negatives, check_gradients=False): + """Creates training batch and computes gradients and loss for the batch. + + Parameters + ---------- + + relations : list of tuples + List of tuples of positive examples of the form (node_1_index, node_2_index). + all_negatives : list of lists + List of lists of negative samples for each node_1 in the positive examples. + check_gradients : bool, optional + Whether to compare the computed gradients to autograd gradients for this batch. + + Returns + ------- + :class:`~gensim.models.poincare.PoincareBatch` + Contains node indices, computed gradients and loss for the batch. + + """ + batch_size = len(relations) + indices_u, indices_v = [], [] + for relation, negatives in zip(relations, all_negatives): + u, v = relation + indices_u.append(u) + indices_v.append(v) + indices_v.extend(negatives) + + vectors_u = self.kv.syn0[indices_u] + vectors_v = self.kv.syn0[indices_v].reshape((batch_size, 1 + self.negative, self.size)) + vectors_v = vectors_v.swapaxes(0, 1).swapaxes(1, 2) + batch = PoincareBatch(vectors_u, vectors_v, indices_u, indices_v, self.regularization_coeff) + batch.compute_all() + + if check_gradients: + self._check_gradients(relations, all_negatives, batch) + + return batch + + def _check_gradients(self, relations, all_negatives, batch, tol=1e-8): + """Compare computed gradients for batch to autograd gradients. + + Parameters + ---------- + batch : PoincareBatch instance + Batch for which computed gradients are to checked. + relations : list of tuples + List of tuples of positive examples of the form (node_1_index, node_2_index). + all_negatives : list of lists + List of lists of negative samples for each node_1 in the positive examples. + + """ + if not AUTOGRAD_PRESENT: + logger.warning('autograd could not be imported, cannot do gradient checking') + logger.warning('please install autograd to enable gradient checking') + return + + if self._loss_grad is None: + self._loss_grad = grad(PoincareModel._loss_fn) + + max_diff = 0.0 + for i, (relation, negatives) in enumerate(zip(relations, all_negatives)): + u, v = relation + auto_gradients = self._loss_grad( + np.vstack((self.kv.syn0[u], self.kv.syn0[[v] + negatives])), self.regularization_coeff) + computed_gradients = np.vstack((batch.gradients_u[:, i], batch.gradients_v[:, :, i])) + diff = np.abs(auto_gradients - computed_gradients).max() + if diff > max_diff: + max_diff = diff + logger.info('Max difference between computed gradients and autograd gradients: %.10f', max_diff) + assert max_diff < tol, ( + 'Max difference between computed gradients and autograd gradients %.10f, ' + 'greater than tolerance %.10f' % (max_diff, tol)) + + def _sample_negatives_batch(self, nodes): + """Return negative examples for each node in the given nodes. + + Parameters + ---------- + nodes : list + List of node indices for which negative samples are to be returned. + + Returns + ------- + list of lists + Each inner list is a list of negative sample for a single node in the input list. + + """ + all_indices = [self._sample_negatives(node) for node in nodes] + return all_indices + + def _train_on_batch(self, relations, check_gradients=False): + """Performs training for a single training batch. + + Parameters + ---------- + relations : list of tuples + List of tuples of positive examples of the form (node_1_index, node_2_index). + check_gradients : bool, optional + Whether to compare the computed gradients to autograd gradients for this batch. + + Returns + ------- + :class:`~gensim.models.poincare.PoincareBatch` + The batch that was just trained on, contains computed loss for the batch. + + """ + all_negatives = self._sample_negatives_batch([relation[0] for relation in relations]) + batch = self._prepare_training_batch(relations, all_negatives, check_gradients) + self._update_vectors_batch(batch) + return batch + + @staticmethod + def _handle_duplicates(vector_updates, node_indices): + """Handles occurrences of multiple updates to the same node in a batch of vector updates. + + Parameters + ---------- + vector_updates : numpy.array + Array with each row containing updates to be performed on a certain node. + node_indices : list + Node indices on which the above updates are to be performed on. + + Notes + ----- + Mutates the `vector_updates` array. + + Required because vectors[[2, 1, 2]] += np.array([-0.5, 1.0, 0.5]) performs only the last update + on the row at index 2. + + """ + counts = Counter(node_indices) + for node_index, count in counts.items(): + if count == 1: + continue + positions = [i for i, index in enumerate(node_indices) if index == node_index] + # Move all updates to the same node to the last such update, zeroing all the others + vector_updates[positions[-1]] = vector_updates[positions].sum(axis=0) + vector_updates[positions[:-1]] = 0 + + def _update_vectors_batch(self, batch): + """Updates vectors for nodes in the given batch. + + Parameters + ---------- + batch : :class:`~gensim.models.poincare.PoincareBatch` + Batch containing computed gradients and node indices of the batch for which updates are to be done. + + """ + grad_u, grad_v = batch.gradients_u, batch.gradients_v + indices_u, indices_v = batch.indices_u, batch.indices_v + batch_size = len(indices_u) + + u_updates = (self.alpha * (batch.alpha ** 2) / 4 * grad_u).T + self._handle_duplicates(u_updates, indices_u) + + self.kv.syn0[indices_u] -= u_updates + self.kv.syn0[indices_u] = self._clip_vectors(self.kv.syn0[indices_u], self.epsilon) + + v_updates = self.alpha * (batch.beta ** 2)[:, np.newaxis] / 4 * grad_v + v_updates = v_updates.swapaxes(1, 2).swapaxes(0, 1) + v_updates = v_updates.reshape(((1 + self.negative) * batch_size, self.size)) + self._handle_duplicates(v_updates, indices_v) + + self.kv.syn0[indices_v] -= v_updates + self.kv.syn0[indices_v] = self._clip_vectors(self.kv.syn0[indices_v], self.epsilon) + + def train(self, epochs, batch_size=10, print_every=1000, check_gradients_every=None): + """Trains Poincare embeddings using loaded data and model parameters. + + Parameters + ---------- + + batch_size : int, optional + Number of examples to train on in a single batch. + epochs : int + Number of iterations (epochs) over the corpus. + print_every : int, optional + Prints progress and average loss after every `print_every` batches. + check_gradients_every : int or None, optional + Compares computed gradients and autograd gradients after every `check_gradients_every` batches. + Useful for debugging, doesn't compare by default. + + Examples + -------- + >>> from gensim.models.poincare import PoincareModel + >>> relations = [('kangaroo', 'marsupial'), ('kangaroo', 'mammal'), ('gib', 'cat')] + >>> model = PoincareModel(relations, negative=2) + >>> model.train(epochs=50) + + """ + if self.workers > 1: + raise NotImplementedError("Multi-threaded version not implemented yet") + # Some divide-by-zero results are handled explicitly + old_settings = np.seterr(divide='ignore', invalid='ignore') + + logger.info( + "training model of size %d with %d workers on %d relations for %d epochs and %d burn-in epochs, " + "using lr=%.5f burn-in lr=%.5f negative=%d", + self.size, self.workers, len(self.all_relations), epochs, self.burn_in, + self.alpha, self.burn_in_alpha, self.negative + ) + + if self.burn_in > 0 and not self._burn_in_done: + logger.info("Starting burn-in (%d epochs)----------------------------------------", self.burn_in) + self.alpha = self.burn_in_alpha + self._train_batchwise( + epochs=self.burn_in, batch_size=batch_size, print_every=print_every, + check_gradients_every=check_gradients_every) + self._burn_in_done = True + logger.info("Burn-in finished") + + self.alpha = self.train_alpha + logger.info("Starting training (%d epochs)----------------------------------------", epochs) + self._train_batchwise( + epochs=epochs, batch_size=batch_size, print_every=print_every, + check_gradients_every=check_gradients_every) + logger.info("Training finished") + + np.seterr(**old_settings) + + def _train_batchwise(self, epochs, batch_size=10, print_every=1000, check_gradients_every=None): + """Trains Poincare embeddings using specified parameters. + + Parameters + ---------- + epochs : int + Number of iterations (epochs) over the corpus. + batch_size : int, optional + Number of examples to train on in a single batch. + print_every : int, optional + Prints progress and average loss after every `print_every` batches. + check_gradients_every : int or None, optional + Compares computed gradients and autograd gradients after every `check_gradients_every` batches. + Useful for debugging, doesn't compare by default. + + """ + if self.workers > 1: + raise NotImplementedError("Multi-threaded version not implemented yet") + for epoch in range(1, epochs + 1): + indices = list(range(len(self.all_relations))) + self._np_random.shuffle(indices) + avg_loss = 0.0 + last_time = time.time() + for batch_num, i in enumerate(range(0, len(indices), batch_size), start=1): + should_print = not (batch_num % print_every) + check_gradients = bool(check_gradients_every) and (batch_num % check_gradients_every) == 0 + batch_indices = indices[i:i + batch_size] + relations = [self.all_relations[idx] for idx in batch_indices] + result = self._train_on_batch(relations, check_gradients=check_gradients) + avg_loss += result.loss + if should_print: + avg_loss /= print_every + time_taken = time.time() - last_time + speed = print_every * batch_size / time_taken + logger.info( + 'Training on epoch %d, examples #%d-#%d, loss: %.2f' + % (epoch, i, i + batch_size, avg_loss)) + logger.info( + 'Time taken for %d examples: %.2f s, %.2f examples / s' + % (print_every * batch_size, time_taken, speed)) + last_time = time.time() + avg_loss = 0.0 + + +class PoincareBatch(object): + """Compute Poincare distances, gradients and loss for a training batch. + + Class for computing Poincare distances, gradients and loss for a training batch, + and storing intermediate state to avoid recomputing multiple times. + + """ + def __init__(self, vectors_u, vectors_v, indices_u, indices_v, regularization_coeff=1.0): + """ + Initialize instance with sets of vectors for which distances are to be computed. + + Parameters + ---------- + vectors_u : numpy.array + Vectors of all nodes `u` in the batch. + Expected shape (batch_size, dim). + vectors_v : numpy.array + Vectors of all positively related nodes `v` and negatively sampled nodes `v'`, + for each node `u` in the batch. + Expected shape (1 + neg_size, dim, batch_size). + indices_u : list + List of node indices for each of the vectors in `vectors_u`. + indices_v : list + Nested list of lists, each of which is a list of node indices + for each of the vectors in `vectors_v` for a specific node `u`. + regularization_coeff : float + Coefficient to use for l2-regularization + + """ + self.vectors_u = vectors_u.T[np.newaxis, :, :] # (1, dim, batch_size) + self.vectors_v = vectors_v # (1 + neg_size, dim, batch_size) + self.indices_u = indices_u + self.indices_v = indices_v + self.regularization_coeff = regularization_coeff + + self.poincare_dists = None + self.euclidean_dists = None + + self.norms_u = None + self.norms_v = None + self.alpha = None + self.beta = None + self.gamma = None + + self.gradients_u = None + self.distance_gradients_u = None + self.gradients_v = None + self.distance_gradients_v = None + + self.loss = None + + self._distances_computed = False + self._gradients_computed = False + self._distance_gradients_computed = False + self._loss_computed = False + + def compute_all(self): + """Convenience method to perform all computations.""" + self.compute_distances() + self.compute_distance_gradients() + self.compute_gradients() + self.compute_loss() + + def compute_distances(self): + """Compute and store norms, euclidean distances and poincare distances between input vectors.""" + if self._distances_computed: + return + euclidean_dists = np.linalg.norm(self.vectors_u - self.vectors_v, axis=1) # (1 + neg_size, batch_size) + norms_u = np.linalg.norm(self.vectors_u, axis=1) # (1, batch_size) + norms_v = np.linalg.norm(self.vectors_v, axis=1) # (1 + neg_size, batch_size) + alpha = 1 - norms_u ** 2 # (1, batch_size) + beta = 1 - norms_v ** 2 # (1 + neg_size, batch_size) + gamma = 1 + 2 * ( + (euclidean_dists ** 2) / (alpha * beta) + ) # (1 + neg_size, batch_size) + poincare_dists = np.arccosh(gamma) # (1 + neg_size, batch_size) + exp_negative_distances = np.exp(-poincare_dists) # (1 + neg_size, batch_size) + Z = exp_negative_distances.sum(axis=0) # (batch_size) + + self.euclidean_dists = euclidean_dists + self.poincare_dists = poincare_dists + self.exp_negative_distances = exp_negative_distances + self.Z = Z + self.gamma = gamma + self.norms_u = norms_u + self.norms_v = norms_v + self.alpha = alpha + self.beta = beta + self.gamma = gamma + + self._distances_computed = True + + def compute_gradients(self): + """Compute and store gradients of loss function for all input vectors.""" + if self._gradients_computed: + return + self.compute_distances() + self.compute_distance_gradients() + + # (1 + neg_size, dim, batch_size) + gradients_v = -self.exp_negative_distances[:, np.newaxis, :] * self.distance_gradients_v + gradients_v /= self.Z # (1 + neg_size, dim, batch_size) + gradients_v[0] += self.distance_gradients_v[0] + gradients_v[0] += self.regularization_coeff * 2 * self.vectors_v[0] + + # (1 + neg_size, dim, batch_size) + gradients_u = -self.exp_negative_distances[:, np.newaxis, :] * self.distance_gradients_u + gradients_u /= self.Z # (1 + neg_size, dim, batch_size) + gradients_u = gradients_u.sum(axis=0) # (dim, batch_size) + gradients_u += self.distance_gradients_u[0] + + assert not np.isnan(gradients_u).any() + assert not np.isnan(gradients_v).any() + self.gradients_u = gradients_u + self.gradients_v = gradients_v + + self._gradients_computed = True + + def compute_distance_gradients(self): + """Compute and store partial derivatives of poincare distance d(u, v) w.r.t all u and all v.""" + if self._distance_gradients_computed: + return + self.compute_distances() + + euclidean_dists_squared = self.euclidean_dists ** 2 # (1 + neg_size, batch_size) + # (1 + neg_size, 1, batch_size) + c_ = (4 / (self.alpha * self.beta * np.sqrt(self.gamma ** 2 - 1)))[:, np.newaxis, :] + # (1 + neg_size, 1, batch_size) + u_coeffs = ((euclidean_dists_squared + self.alpha) / self.alpha)[:, np.newaxis, :] + distance_gradients_u = u_coeffs * self.vectors_u - self.vectors_v # (1 + neg_size, dim, batch_size) + distance_gradients_u *= c_ # (1 + neg_size, dim, batch_size) + + nan_gradients = self.gamma == 1 # (1 + neg_size, batch_size) + if nan_gradients.any(): + distance_gradients_u.swapaxes(1, 2)[nan_gradients] = 0 + self.distance_gradients_u = distance_gradients_u + + # (1 + neg_size, 1, batch_size) + v_coeffs = ((euclidean_dists_squared + self.beta) / self.beta)[:, np.newaxis, :] + distance_gradients_v = v_coeffs * self.vectors_v - self.vectors_u # (1 + neg_size, dim, batch_size) + distance_gradients_v *= c_ # (1 + neg_size, dim, batch_size) + + if nan_gradients.any(): + distance_gradients_v.swapaxes(1, 2)[nan_gradients] = 0 + self.distance_gradients_v = distance_gradients_v + + self._distance_gradients_computed = True + + def compute_loss(self): + """Compute and store loss value for the given batch of examples.""" + if self._loss_computed: + return + self.compute_distances() + + self.loss = -np.log(self.exp_negative_distances[0] / self.Z).sum() # scalar + self._loss_computed = True + + +class PoincareKeyedVectors(KeyedVectorsBase): + """Class to contain vectors and vocab for the :class:`~gensim.models.poincare.PoincareModel` training class. + + Used to perform operations on the vectors such as vector lookup, distance etc. + + """ + + def __init__(self): + super(PoincareKeyedVectors, self).__init__() + self.max_distance = 0 + + @staticmethod + def vector_distance(vector_1, vector_2): + """ + Return poincare distance between two input vectors. Convenience method over `vector_distance_batch`. + + Parameters + ---------- + vector_1 : numpy.array + input vector + vector_2 : numpy.array + input vector + + Returns + ------- + numpy.float + Poincare distance between `vector_1` and `vector_2`. + + """ + return PoincareKeyedVectors.vector_distance_batch(vector_1, vector_2[np.newaxis, :])[0] + + @staticmethod + def vector_distance_batch(vector_1, vectors_all): + """ + Return poincare distances between one vector and a set of other vectors. + + Parameters + ---------- + vector_1 : numpy.array + vector from which Poincare distances are to be computed. + expected shape (dim,) + vectors_all : numpy.array + for each row in vectors_all, distance from vector_1 is computed. + expected shape (num_vectors, dim) + + Returns + ------- + numpy.array + Contains Poincare distance between vector_1 and each row in vectors_all. + shape (num_vectors,) + + """ + euclidean_dists = np.linalg.norm(vector_1 - vectors_all, axis=1) + norm = np.linalg.norm(vector_1) + all_norms = np.linalg.norm(vectors_all, axis=1) + return np.arccosh( + 1 + 2 * ( + (euclidean_dists ** 2) / ((1 - norm ** 2) * (1 - all_norms ** 2)) + ) + ) + + def closest_child(self, node): + """ + Returns the node closest to `node` that is lower in the hierarchy than `node`. + + Parameters + ---------- + node : str or int + Key for node for which closest child is to be found. + + Returns + ------- + str or None + Node closest to `node` that is lower in the hierarchy than `node`. + If there are no nodes lower in the hierarchy, None is returned. + + """ + all_distances = self.distances(node) + all_norms = np.linalg.norm(self.syn0, axis=1) + node_norm = all_norms[self.vocab[node].index] + mask = node_norm >= all_norms + if mask.all(): # No nodes lower in the hierarchy + return None + all_distances = np.ma.array(all_distances, mask=mask) + closest_child_index = np.ma.argmin(all_distances) + return self.index2word[closest_child_index] + + def closest_parent(self, node): + """ + Returns the node closest to `node` that is higher in the hierarchy than `node`. + + Parameters + ---------- + node : str or int + Key for node for which closest parent is to be found. + + Returns + ------- + str or None + Node closest to `node` that is higher in the hierarchy than `node`. + If there are no nodes higher in the hierarchy, None is returned. + + """ + all_distances = self.distances(node) + all_norms = np.linalg.norm(self.syn0, axis=1) + node_norm = all_norms[self.vocab[node].index] + mask = node_norm <= all_norms + if mask.all(): # No nodes higher in the hierarchy + return None + all_distances = np.ma.array(all_distances, mask=mask) + closest_child_index = np.ma.argmin(all_distances) + return self.index2word[closest_child_index] + + def descendants(self, node, max_depth=5): + """ + Returns the list of recursively closest children from the given node, upto a max depth of `max_depth`. + + Parameters + ---------- + node : str or int + Key for node for which descendants are to be found. + max_depth : int + Maximum number of descendants to return. + + Returns + ------- + list (str) + Descendant nodes from the node `node`. + + """ + depth = 0 + descendants = [] + current_node = node + while depth < max_depth: + descendants.append(self.closest_child(current_node)) + current_node = descendants[-1] + depth += 1 + return descendants + + def ancestors(self, node): + """ + Returns the list of recursively closest parents from the given node. + + Parameters + ---------- + node : str or int + Key for node for which ancestors are to be found. + + Returns + ------- + list (str) + Ancestor nodes of the node `node`. + + """ + ancestors = [] + current_node = node + ancestor = self.closest_parent(current_node) + while ancestor is not None: + ancestors.append(ancestor) + ancestor = self.closest_parent(ancestors[-1]) + return ancestors + + def distance(self, w1, w2): + """ + Return Poincare distance between vectors for nodes `w1` and `w2`. + + Parameters + ---------- + w1 : str or int + Key for first node. + w2 : str or int + Key for second node. + + Returns + ------- + float + Poincare distance between the vectors for nodes `w1` and `w2`. + + Examples + -------- + + >>> model.distance('mammal.n.01', 'carnivore.n.01') + 2.13 + + Notes + ----- + Raises KeyError if either of `w1` and `w2` is absent from vocab. + + """ + vector_1 = self.word_vec(w1) + vector_2 = self.word_vec(w2) + return self.vector_distance(vector_1, vector_2) + + def similarity(self, w1, w2): + """ + Return similarity based on Poincare distance between vectors for nodes `w1` and `w2`. + + Parameters + ---------- + w1 : str or int + Key for first node. + w2 : str or int + Key for second node. + + Returns + ------- + float + Similarity between the between the vectors for nodes `w1` and `w2` (between 0 and 1). + + Examples + -------- + + >>> model.similarity('mammal.n.01', 'carnivore.n.01') + 0.73 + + Notes + ----- + Raises KeyError if either of `w1` and `w2` is absent from vocab. + Similarity lies between 0 and 1. + + """ + return 1 / (1 + self.distance(w1, w2)) + + def most_similar(self, node_or_vector, topn=10, restrict_vocab=None): + """ + Find the top-N most similar nodes to the given node or vector, sorted in increasing order of distance. + + Parameters + ---------- + + node_or_vector : str/int or numpy.array + node key or vector for which similar nodes are to be found. + topn : int or None, optional + number of similar nodes to return, if `None`, returns all. + restrict_vocab : int or None, optional + Optional integer which limits the range of vectors which are searched for most-similar values. + For example, restrict_vocab=10000 would only check the first 10000 node vectors in the vocabulary order. + This may be meaningful if vocabulary is sorted by descending frequency. + + Returns + -------- + list of tuples (str, float) + List of tuples containing (node, distance) pairs in increasing order of distance. + + Examples + -------- + >>> vectors.most_similar('lion.n.01') + [('lion_cub.n.01', 0.4484), ('lionet.n.01', 0.6552), ...] + + """ + if not restrict_vocab: + all_distances = self.distances(node_or_vector) + else: + nodes_to_use = self.index2word[:restrict_vocab] + all_distances = self.distances(node_or_vector, nodes_to_use) + + if isinstance(node_or_vector, string_types + (int,)): + node_index = self.vocab[node_or_vector].index + else: + node_index = None + if not topn: + closest_indices = matutils.argsort(all_distances) + else: + closest_indices = matutils.argsort(all_distances, topn=1 + topn) + result = [ + (self.index2word[index], float(all_distances[index])) + for index in closest_indices if (not node_index or index != node_index) # ignore the input node + ] + if topn: + result = result[:topn] + return result + + def distances(self, node_or_vector, other_nodes=()): + """ + Compute Poincare distances from given node or vector to all nodes in `other_nodes`. + If `other_nodes` is empty, return distance between `node_or_vector` and all nodes in vocab. + + Parameters + ---------- + node_or_vector : str/int or numpy.array + Node key or vector from which distances are to be computed. + + other_nodes : iterable of str/int or None + For each node in `other_nodes` distance from `node_or_vector` is computed. + If None or empty, distance of `node_or_vector` from all nodes in vocab is computed (including itself). + + Returns + ------- + numpy.array + Array containing distances to all nodes in `other_nodes` from input `node_or_vector`, + in the same order as `other_nodes`. + + Examples + -------- + + >>> model.distances('mammal.n.01', ['carnivore.n.01', 'dog.n.01']) + np.array([2.1199, 2.0710] + + >>> model.distances('mammal.n.01') + np.array([0.43753847, 3.67973852, ..., 6.66172886]) + + Notes + ----- + Raises KeyError if either `node_or_vector` or any node in `other_nodes` is absent from vocab. + + """ + if isinstance(node_or_vector, string_types): + input_vector = self.word_vec(node_or_vector) + else: + input_vector = node_or_vector + if not other_nodes: + other_vectors = self.syn0 + else: + other_indices = [self.vocab[node].index for node in other_nodes] + other_vectors = self.syn0[other_indices] + return self.vector_distance_batch(input_vector, other_vectors) + + def norm(self, node_or_vector): + """ + Return absolute position in hierarchy of input node or vector. + Values range between 0 and 1. A lower value indicates the input node or vector is higher in the hierarchy. + + Parameters + ---------- + node_or_vector : str/int or numpy.array + Input node key or vector for which position in hierarchy is to be returned. + + Returns + ------- + float + Absolute position in the hierarchy of the input vector or node. + + Examples + -------- + + >>> model.norm('mammal.n.01') + 0.9 + + Notes + ----- + The position in hierarchy is based on the norm of the vector for the node. + + """ + if isinstance(node_or_vector, string_types): + input_vector = self.word_vec(node_or_vector) + else: + input_vector = node_or_vector + return np.linalg.norm(input_vector) + + def difference_in_hierarchy(self, node_or_vector_1, node_or_vector_2): + """ + Relative position in hierarchy of `node_or_vector_1` relative to `node_or_vector_2`. + A positive value indicates `node_or_vector_1` is higher in the hierarchy than `node_or_vector_2`. + + Parameters + ---------- + node_or_vector_1 : str/int or numpy.array + Input node key or vector. + + node_or_vector_2 : str/int or numpy.array + Input node key or vector. + + Returns + ------- + float + Relative position in hierarchy of `node_or_vector_1` relative to `node_or_vector_2`. + + Examples + -------- + + >>> model.difference_in_hierarchy('mammal.n.01', 'dog.n.01') + 0.51 + + >>> model.difference_in_hierarchy('dog.n.01', 'mammal.n.01') + -0.51 + + Notes + ----- + The returned value can be positive or negative, depending on whether `node_or_vector_1` is higher + or lower in the hierarchy than `node_or_vector_2`. + + """ + return self.norm(node_or_vector_2) - self.norm(node_or_vector_1) + + +class PoincareRelations(object): + """Class to stream relations for `PoincareModel` from a tsv-like file.""" + + def __init__(self, file_path, encoding='utf8', delimiter='\t'): + """Initialize instance from file containing a pair of nodes (a relation) per line. + + Parameters + ---------- + file_path : str + Path to file containing a pair of nodes (a relation) per line, separated by `delimiter`. + encoding : str, optional + Character encoding of the input file. + delimiter : str, optional + Delimiter character for each relation. + + """ + + self.file_path = file_path + self.encoding = encoding + self.delimiter = delimiter + + def __iter__(self): + """Streams relations from self.file_path decoded into unicode strings. + + Yields + ------- + 2-tuple (unicode, unicode) + Relation from input file. + + """ + with smart_open(self.file_path) as file_obj: + if sys.version_info[0] < 3: + lines = file_obj + else: + lines = (l.decode(self.encoding) for l in file_obj) + # csv.reader requires bytestring input in python2, unicode input in python3 + reader = csv.reader(lines, delimiter=self.delimiter) + for row in reader: + if sys.version_info[0] < 3: + row = [value.decode(self.encoding) for value in row] + yield tuple(row) + + +class NegativesBuffer(object): + """Class to buffer and return negative samples.""" + + def __init__(self, items): + """Initialize instance from list or numpy array of samples. + + Parameters + ---------- + items : list/numpy.array + List or array containing negative samples. + + """ + + self._items = items + self._current_index = 0 + + def num_items(self): + """Returns number of items remaining in the buffer. + + Returns + ------- + int + Number of items in the buffer that haven't been consumed yet. + + """ + return len(self._items) - self._current_index + + def get_items(self, num_items): + """Returns next `num_items` from buffer. + + Parameters + ---------- + num_items : int + Number of items to fetch. + + Returns + ------- + numpy.array or list + Slice containing `num_items` items from the original data. + + Notes + ----- + No error is raised if less than `num_items` items are remaining, + simply all the remaining items are returned. + + """ + start_index = self._current_index + end_index = start_index + num_items + self._current_index += num_items + return self._items[start_index:end_index] + + +class ReconstructionEvaluation(object): + """Evaluating reconstruction on given network for given embedding.""" + + def __init__(self, file_path, embedding): + """Initialize evaluation instance with tsv file containing relation pairs and embedding to be evaluated. + + Parameters + ---------- + file_path : str + Path to tsv file containing relation pairs. + embedding : PoincareKeyedVectors instance + Embedding to be evaluated. + + """ + items = set() + embedding_vocab = embedding.vocab + relations = defaultdict(set) + with smart_open(file_path, 'r') as f: + reader = csv.reader(f, delimiter='\t') + for row in reader: + assert len(row) == 2, 'Hypernym pair has more than two items' + item_1_index = embedding_vocab[row[0]].index + item_2_index = embedding_vocab[row[1]].index + relations[item_1_index].add(item_2_index) + items.update([item_1_index, item_2_index]) + self.items = items + self.relations = relations + self.embedding = embedding + + @staticmethod + def get_positive_relation_ranks_and_avg_prec(all_distances, positive_relations): + """ + Given a numpy array of all distances from an item and indices of its positive relations, + compute ranks and Average Precision of positive relations. + + Parameters + ---------- + all_distances : numpy.array (float) + Array of all distances (floats) for a specific item. + positive_relations : list + List of indices of positive relations for the item. + + Returns + ------- + tuple (list, float) + The list contains ranks (int) of positive relations in the same order as `positive_relations`. + The float is the Average Precision of the ranking. + e.g. ([1, 2, 3, 20], 0.610). + + """ + positive_relation_distances = all_distances[positive_relations] + negative_relation_distances = np.ma.array(all_distances, mask=False) + negative_relation_distances.mask[positive_relations] = True + # Compute how many negative relation distances are less than each positive relation distance, plus 1 for rank + ranks = (negative_relation_distances < positive_relation_distances[:, np.newaxis]).sum(axis=1) + 1 + map_ranks = np.sort(ranks) + np.arange(len(ranks)) + avg_precision = ((np.arange(1, len(map_ranks) + 1) / np.sort(map_ranks)).mean()) + return list(ranks), avg_precision + + def evaluate(self, max_n=None): + """Evaluate all defined metrics for the reconstruction task. + + Parameters + ---------- + max_n : int or None + Maximum number of positive relations to evaluate, all if `max_n` is None. + + Returns + ------- + dict + Contains (metric_name, metric_value) pairs. + e.g. {'mean_rank': 50.3, 'MAP': 0.31}. + + """ + mean_rank, map_ = self.evaluate_mean_rank_and_map(max_n) + return {'mean_rank': mean_rank, 'MAP': map_} + + def evaluate_mean_rank_and_map(self, max_n=None): + """Evaluate mean rank and MAP for reconstruction. + + Parameters + ---------- + max_n : int or None + Maximum number of positive relations to evaluate, all if `max_n` is None. + + Returns + ------- + tuple (float, float) + Contains (mean_rank, MAP). + e.g (50.3, 0.31) + + """ + ranks = [] + avg_precision_scores = [] + for i, item in enumerate(self.items, start=1): + if item not in self.relations: + continue + item_relations = list(self.relations[item]) + item_term = self.embedding.index2word[item] + item_distances = self.embedding.distances(item_term) + positive_relation_ranks, avg_precision = \ + self.get_positive_relation_ranks_and_avg_prec(item_distances, item_relations) + ranks += positive_relation_ranks + avg_precision_scores.append(avg_precision) + if max_n is not None and i > max_n: + break + return np.mean(ranks), np.mean(avg_precision_scores) + + +class LinkPredictionEvaluation(object): + """Evaluating reconstruction on given network for given embedding.""" + + def __init__(self, train_path, test_path, embedding): + """Initialize evaluation instance with tsv file containing relation pairs and embedding to be evaluated. + + Parameters + ---------- + train_path : str + Path to tsv file containing relation pairs used for training. + test_path : str + Path to tsv file containing relation pairs to evaluate. + embedding : PoincareKeyedVectors instance + Embedding to be evaluated. + + """ + items = set() + embedding_vocab = embedding.vocab + relations = {'known': defaultdict(set), 'unknown': defaultdict(set)} + data_files = {'known': train_path, 'unknown': test_path} + for relation_type, data_file in data_files.items(): + with smart_open(data_file, 'r') as f: + reader = csv.reader(f, delimiter='\t') + for row in reader: + assert len(row) == 2, 'Hypernym pair has more than two items' + item_1_index = embedding_vocab[row[0]].index + item_2_index = embedding_vocab[row[1]].index + relations[relation_type][item_1_index].add(item_2_index) + items.update([item_1_index, item_2_index]) + self.items = items + self.relations = relations + self.embedding = embedding + + @staticmethod + def get_unknown_relation_ranks_and_avg_prec(all_distances, unknown_relations, known_relations): + """ + Given a numpy array of distances and indices of known and unknown positive relations, + compute ranks and Average Precision of unknown positive relations. + + Parameters + ---------- + all_distances : numpy.array (float) + Array of all distances for a specific item. + unknown_relations : list + List of indices of unknown positive relations. + known_relations : list + List of indices of known positive relations. + + Returns + ------- + tuple (list, float) + The list contains ranks (int) of positive relations in the same order as `positive_relations`. + The float is the Average Precision of the ranking. + e.g. ([1, 2, 3, 20], 0.610). + + """ + unknown_relation_distances = all_distances[unknown_relations] + negative_relation_distances = np.ma.array(all_distances, mask=False) + negative_relation_distances.mask[unknown_relations] = True + negative_relation_distances.mask[known_relations] = True + # Compute how many negative relation distances are less than each unknown relation distance, plus 1 for rank + ranks = (negative_relation_distances < unknown_relation_distances[:, np.newaxis]).sum(axis=1) + 1 + map_ranks = np.sort(ranks) + np.arange(len(ranks)) + avg_precision = ((np.arange(1, len(map_ranks) + 1) / np.sort(map_ranks)).mean()) + return list(ranks), avg_precision + + def evaluate(self, max_n=None): + """Evaluate all defined metrics for the link prediction task. + + Parameters + ---------- + max_n : int or None + Maximum number of positive relations to evaluate, all if `max_n` is None. + + Returns + ------- + dict + Contains (metric_name, metric_value) pairs. + e.g. {'mean_rank': 50.3, 'MAP': 0.31}. + + """ + mean_rank, map_ = self.evaluate_mean_rank_and_map(max_n) + return {'mean_rank': mean_rank, 'MAP': map_} + + def evaluate_mean_rank_and_map(self, max_n=None): + """Evaluate mean rank and MAP for link prediction. + + Parameters + ---------- + max_n : int or None + Maximum number of positive relations to evaluate, all if `max_n` is None. + + Returns + ------- + tuple (float, float) + Contains (mean_rank, MAP). + e.g (50.3, 0.31). + + """ + ranks = [] + avg_precision_scores = [] + for i, item in enumerate(self.items, start=1): + if item not in self.relations['unknown']: # No positive relations to predict for this node + continue + unknown_relations = list(self.relations['unknown'][item]) + known_relations = list(self.relations['known'][item]) + item_term = self.embedding.index2word[item] + item_distances = self.embedding.distances(item_term) + unknown_relation_ranks, avg_precision = \ + self.get_unknown_relation_ranks_and_avg_prec(item_distances, unknown_relations, known_relations) + ranks += unknown_relation_ranks + avg_precision_scores.append(avg_precision) + if max_n is not None and i > max_n: + break + return np.mean(ranks), np.mean(avg_precision_scores) + + +class LexicalEntailmentEvaluation(object): + """Evaluating reconstruction on given network for any embedding.""" + + def __init__(self, filepath): + """Initialize evaluation instance with HyperLex text file containing relation pairs. + + Parameters + ---------- + filepath : str + Path to HyperLex text file. + + """ + expected_scores = {} + with smart_open(filepath, 'r') as f: + reader = csv.DictReader(f, delimiter=' ') + for row in reader: + word_1, word_2 = row['WORD1'], row['WORD2'] + expected_scores[(word_1, word_2)] = float(row['AVG_SCORE']) + self.scores = expected_scores + self.alpha = 1000 + + def score_function(self, embedding, trie, term_1, term_2): + """ + Given an embedding and two terms, return the predicted score for them - + extent to which `term_1` is a type of `term_2`. + + Parameters + ---------- + embedding : PoincareKeyedVectors instance + Embedding to use for computing predicted score. + trie : pygtrie.Trie instance + Trie to use for finding matching vocab terms for input terms. + term_1 : str + Input term. + term_2 : str + Input term. + + Returns + ------- + float + Predicted score (the extent to which `term_1` is a type of `term_2`). + + """ + try: + word_1_terms = self.find_matching_terms(trie, term_1) + word_2_terms = self.find_matching_terms(trie, term_2) + except KeyError: + raise ValueError("No matching terms found for either %s or %s" % (term_1, term_2)) + min_distance = np.inf + min_term_1, min_term_2 = None, None + for term_1 in word_1_terms: + for term_2 in word_2_terms: + distance = embedding.distance(term_1, term_2) + if distance < min_distance: + min_term_1, min_term_2 = term_1, term_2 + min_distance = distance + assert min_term_1 is not None and min_term_2 is not None + vector_1, vector_2 = embedding.word_vec(min_term_1), embedding.word_vec(min_term_2) + norm_1, norm_2 = np.linalg.norm(vector_1), np.linalg.norm(vector_2) + return -1 * (1 + self.alpha * (norm_2 - norm_1)) * distance + + @staticmethod + def find_matching_terms(trie, word): + """ + Given a trie and a word, find terms in the trie beginning with the word. + + Parameters + ---------- + trie : pygtrie.Trie instance + Trie to use for finding matching terms. + word : str + Input word to use for prefix search. + + Returns + ------- + list (str) + List of matching terms. + + """ + matches = trie.items('%s.' % word) + matching_terms = [''.join(key_chars) for key_chars, value in matches] + return matching_terms + + @staticmethod + def create_vocab_trie(embedding): + """Create trie with vocab terms of the given embedding to enable quick prefix searches. + + Parameters + ---------- + embedding : PoincareKeyedVectors instance + Embedding for which trie is to be created. + + Returns + ------- + pygtrie.Trie instance + Trie containing vocab terms of the input embedding. + + """ + try: + from pygtrie import Trie + except ImportError: + raise ImportError( + 'pygtrie could not be imported, please install pygtrie in order to use LexicalEntailmentEvaluation') + + vocab_trie = Trie() + for key in embedding.vocab: + vocab_trie[key] = True + return vocab_trie + + def evaluate_spearman(self, embedding): + """Evaluate spearman scores for lexical entailment for given embedding. + + Parameters + ---------- + embedding : PoincareKeyedVectors instance + Embedding for which evaluation is to be done. + + Returns + ------- + float + Spearman correlation score for the task for input embedding. + + """ + predicted_scores = [] + expected_scores = [] + skipped = 0 + count = 0 + vocab_trie = self.create_vocab_trie(embedding) + for (word_1, word_2), expected_score in self.scores.items(): + try: + predicted_score = self.score_function(embedding, vocab_trie, word_1, word_2) + except ValueError: + skipped += 1 + continue + count += 1 + predicted_scores.append(predicted_score) + expected_scores.append(expected_score) + print('Skipped pairs: %d out of %d' % (skipped, len(self.scores))) + spearman = spearmanr(expected_scores, predicted_scores) + return spearman.correlation diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 4c9b7f557f..c4d953e123 100644 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -128,6 +128,7 @@ from scipy.special import expit from gensim import utils, matutils # utility fnc for pickling, common scipy operations etc +from gensim.utils import deprecated from six import iteritems, itervalues, string_types from six.moves import xrange from types import GeneratorType @@ -1365,6 +1366,7 @@ def intersect_word2vec_format(self, fname, lockf=0.0, binary=False, encoding='ut self.syn0_lockf[self.wv.vocab[word].index] = lockf # lock-factor: 0.0 stops further changes logger.info("merged %d vectors into %s matrix from %s", overlap_count, self.wv.syn0.shape, fname) + @deprecated("Method will be removed in 4.0.0, use self.wv.most_similar() instead") def most_similar(self, positive=None, negative=None, topn=10, restrict_vocab=None, indexer=None): """ Deprecated. Use self.wv.most_similar() instead. @@ -1372,6 +1374,7 @@ def most_similar(self, positive=None, negative=None, topn=10, restrict_vocab=Non """ return self.wv.most_similar(positive, negative, topn, restrict_vocab, indexer) + @deprecated("Method will be removed in 4.0.0, use self.wv.wmdistance() instead") def wmdistance(self, document1, document2): """ Deprecated. Use self.wv.wmdistance() instead. @@ -1379,6 +1382,7 @@ def wmdistance(self, document1, document2): """ return self.wv.wmdistance(document1, document2) + @deprecated("Method will be removed in 4.0.0, use self.wv.most_similar_cosmul() instead") def most_similar_cosmul(self, positive=None, negative=None, topn=10): """ Deprecated. Use self.wv.most_similar_cosmul() instead. @@ -1386,6 +1390,7 @@ def most_similar_cosmul(self, positive=None, negative=None, topn=10): """ return self.wv.most_similar_cosmul(positive, negative, topn) + @deprecated("Method will be removed in 4.0.0, use self.wv.similar_by_word() instead") def similar_by_word(self, word, topn=10, restrict_vocab=None): """ Deprecated. Use self.wv.similar_by_word() instead. @@ -1393,6 +1398,7 @@ def similar_by_word(self, word, topn=10, restrict_vocab=None): """ return self.wv.similar_by_word(word, topn, restrict_vocab) + @deprecated("Method will be removed in 4.0.0, use self.wv.similar_by_vector() instead") def similar_by_vector(self, vector, topn=10, restrict_vocab=None): """ Deprecated. Use self.wv.similar_by_vector() instead. @@ -1400,6 +1406,7 @@ def similar_by_vector(self, vector, topn=10, restrict_vocab=None): """ return self.wv.similar_by_vector(vector, topn, restrict_vocab) + @deprecated("Method will be removed in 4.0.0, use self.wv.doesnt_match() instead") def doesnt_match(self, words): """ Deprecated. Use self.wv.doesnt_match() instead. @@ -1407,6 +1414,7 @@ def doesnt_match(self, words): """ return self.wv.doesnt_match(words) + @deprecated("Method will be removed in 4.0.0, use self.wv.__getitem__() instead") def __getitem__(self, words): """ Deprecated. Use self.wv.__getitem__() instead. @@ -1414,6 +1422,7 @@ def __getitem__(self, words): """ return self.wv.__getitem__(words) + @deprecated("Method will be removed in 4.0.0, use self.wv.__contains__() instead") def __contains__(self, word): """ Deprecated. Use self.wv.__contains__() instead. @@ -1421,6 +1430,7 @@ def __contains__(self, word): """ return self.wv.__contains__(word) + @deprecated("Method will be removed in 4.0.0, use self.wv.similarity() instead") def similarity(self, w1, w2): """ Deprecated. Use self.wv.similarity() instead. @@ -1428,6 +1438,7 @@ def similarity(self, w1, w2): """ return self.wv.similarity(w1, w2) + @deprecated("Method will be removed in 4.0.0, use self.wv.n_similarity() instead") def n_similarity(self, ws1, ws2): """ Deprecated. Use self.wv.n_similarity() instead. @@ -1499,6 +1510,7 @@ def accuracy(self, questions, restrict_vocab=30000, most_similar=None, case_inse return self.wv.accuracy(questions, restrict_vocab, most_similar, case_insensitive) @staticmethod + @deprecated("Method will be removed in 4.0.0, use self.wv.log_evaluate_word_pairs() instead") def log_evaluate_word_pairs(pearson, spearman, oov, pairs): """ Deprecated. Use self.wv.log_evaluate_word_pairs() instead. @@ -1506,6 +1518,7 @@ def log_evaluate_word_pairs(pearson, spearman, oov, pairs): """ return KeyedVectors.log_evaluate_word_pairs(pearson, spearman, oov, pairs) + @deprecated("Method will be removed in 4.0.0, use self.wv.evaluate_word_pairs() instead") def evaluate_word_pairs(self, pairs, delimiter='\t', restrict_vocab=300000, case_insensitive=True, dummy4unknown=False): """ @@ -1519,12 +1532,10 @@ def __str__(self): self.__class__.__name__, len(self.wv.index2word), self.vector_size, self.alpha ) + @deprecated( + "Method will be removed in 4.0.0, keep just_word_vectors = model.wv to retain just the KeyedVectors instance" + ) def _minimize_model(self, save_syn1=False, save_syn1neg=False, save_syn0_lockf=False): - warnings.warn( - "This method would be deprecated in the future. " - "Keep just_word_vectors = model.wv to retain just the KeyedVectors instance " - "for read-only querying of word vectors." - ) if save_syn1 and save_syn1neg and save_syn0_lockf: return if hasattr(self, 'syn1') and not save_syn1: @@ -1590,11 +1601,13 @@ def _load_specials(self, *args, **kwargs): self.wv = wv @classmethod + @deprecated("Method will be removed in 4.0.0, use gensim.models.KeyedVectors.load_word2vec_format instead") def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', unicode_errors='strict', limit=None, datatype=REAL): """Deprecated. Use gensim.models.KeyedVectors.load_word2vec_format instead.""" raise DeprecationWarning("Deprecated. Use gensim.models.KeyedVectors.load_word2vec_format instead.") + @deprecated("Method will be removed in 4.0.0, use model.wv.save_word2vec_format instead") def save_word2vec_format(self, fname, fvocab=None, binary=False): """Deprecated. Use model.wv.save_word2vec_format instead.""" raise DeprecationWarning("Deprecated. Use model.wv.save_word2vec_format instead.") diff --git a/gensim/models/word2vec_inner.c b/gensim/models/word2vec_inner.c index f807aa7de6..b6ccba2524 100644 --- a/gensim/models/word2vec_inner.c +++ b/gensim/models/word2vec_inner.c @@ -660,7 +660,7 @@ static const char *__pyx_f[] = { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":725 * # in Cython to enable them only on the right systems. - * + * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t @@ -668,7 +668,7 @@ static const char *__pyx_f[] = { typedef npy_int8 __pyx_t_5numpy_int8_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":726 - * + * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< * ctypedef npy_int32 int32_t @@ -696,7 +696,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":732 * #ctypedef npy_int128 int128_t - * + * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t @@ -704,7 +704,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; typedef npy_uint8 __pyx_t_5numpy_uint8_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":733 - * + * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< * ctypedef npy_uint32 uint32_t @@ -732,7 +732,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":739 * #ctypedef npy_uint128 uint128_t - * + * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< * ctypedef npy_float64 float64_t * #ctypedef npy_float80 float80_t @@ -740,7 +740,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; typedef npy_float32 __pyx_t_5numpy_float32_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":740 - * + * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< * #ctypedef npy_float80 float80_t @@ -762,7 +762,7 @@ typedef npy_long __pyx_t_5numpy_int_t; * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< * ctypedef npy_longlong longlong_t - * + * */ typedef npy_longlong __pyx_t_5numpy_long_t; @@ -770,14 +770,14 @@ typedef npy_longlong __pyx_t_5numpy_long_t; * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< - * + * * ctypedef npy_ulong uint_t */ typedef npy_longlong __pyx_t_5numpy_longlong_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":753 * ctypedef npy_longlong longlong_t - * + * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t @@ -785,11 +785,11 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; typedef npy_ulong __pyx_t_5numpy_uint_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":754 - * + * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulonglong_t - * + * */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; @@ -797,32 +797,32 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< - * + * * ctypedef npy_intp intp_t */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":757 * ctypedef npy_ulonglong ulonglong_t - * + * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< * ctypedef npy_uintp uintp_t - * + * */ typedef npy_intp __pyx_t_5numpy_intp_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":758 - * + * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< - * + * * ctypedef npy_double float_t */ typedef npy_uintp __pyx_t_5numpy_uintp_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_uintp uintp_t - * + * * ctypedef npy_double float_t # <<<<<<<<<<<<<< * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t @@ -830,11 +830,11 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; typedef npy_double __pyx_t_5numpy_float_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":761 - * + * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< * ctypedef npy_longdouble longdouble_t - * + * */ typedef npy_double __pyx_t_5numpy_double_t; @@ -842,16 +842,16 @@ typedef npy_double __pyx_t_5numpy_double_t; * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< - * + * * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; /* "gensim/models/word2vec_inner.pxd":12 - * + * * cimport numpy as np * ctypedef np.float32_t REAL_t # <<<<<<<<<<<<<< - * + * * # BLAS routine signatures */ typedef __pyx_t_5numpy_float32_t __pyx_t_6gensim_6models_14word2vec_inner_REAL_t; @@ -884,7 +884,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":764 * ctypedef npy_longdouble longdouble_t - * + * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t @@ -892,11 +892,11 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do typedef npy_cfloat __pyx_t_5numpy_cfloat_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":765 - * + * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< * ctypedef npy_clongdouble clongdouble_t - * + * */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; @@ -904,22 +904,22 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< - * + * * ctypedef npy_cdouble complex_t */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":768 * ctypedef npy_clongdouble clongdouble_t - * + * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; /* "gensim/models/word2vec_inner.pxd":15 - * + * * # BLAS routine signatures * ctypedef void (*scopy_ptr) (const int *N, const float *X, const int *incX, float *Y, const int *incY) nogil # <<<<<<<<<<<<<< * ctypedef void (*saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil @@ -959,7 +959,7 @@ typedef double (*__pyx_t_6gensim_6models_14word2vec_inner_dsdot_ptr)(int const * * ctypedef double (*dsdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil * ctypedef double (*snrm2_ptr) (const int *N, const float *X, const int *incX) nogil # <<<<<<<<<<<<<< * ctypedef void (*sscal_ptr) (const int *N, const float *alpha, const float *X, const int *incX) nogil - * + * */ typedef double (*__pyx_t_6gensim_6models_14word2vec_inner_snrm2_ptr)(int const *, float const *, int const *); @@ -967,17 +967,17 @@ typedef double (*__pyx_t_6gensim_6models_14word2vec_inner_snrm2_ptr)(int const * * ctypedef double (*dsdot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil * ctypedef double (*snrm2_ptr) (const int *N, const float *X, const int *incX) nogil * ctypedef void (*sscal_ptr) (const int *N, const float *alpha, const float *X, const int *incX) nogil # <<<<<<<<<<<<<< - * + * * cdef scopy_ptr scopy */ typedef void (*__pyx_t_6gensim_6models_14word2vec_inner_sscal_ptr)(int const *, float const *, float const *, int const *); /* "gensim/models/word2vec_inner.pxd":35 - * + * * # function implementations swapped based on BLAS detected in word2vec_inner.pyx init() * ctypedef REAL_t (*our_dot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil # <<<<<<<<<<<<<< * ctypedef void (*our_saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil - * + * */ typedef __pyx_t_6gensim_6models_14word2vec_inner_REAL_t (*__pyx_t_6gensim_6models_14word2vec_inner_our_dot_ptr)(int const *, float const *, int const *, float const *, int const *); @@ -985,7 +985,7 @@ typedef __pyx_t_6gensim_6models_14word2vec_inner_REAL_t (*__pyx_t_6gensim_6model * # function implementations swapped based on BLAS detected in word2vec_inner.pyx init() * ctypedef REAL_t (*our_dot_ptr) (const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil * ctypedef void (*our_saxpy_ptr) (const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil # <<<<<<<<<<<<<< - * + * * cdef our_dot_ptr our_dot */ typedef void (*__pyx_t_6gensim_6models_14word2vec_inner_our_saxpy_ptr)(int const *, float const *, float const *, int const *, float *, int const *); @@ -1589,11 +1589,11 @@ static const char __pyx_k_running_training_loss[] = "running_training_loss"; static const char __pyx_k_running_training_loss_2[] = "_running_training_loss"; static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; static const char __pyx_k_gensim_models_word2vec_inner[] = "gensim.models.word2vec_inner"; -static const char __pyx_k_home_ivan_release_gensim_gensim[] = "/home/ivan/release/gensim/gensim/models/word2vec_inner.pyx"; static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static const char __pyx_k_gensim_models_word2vec_inner_pyx[] = "gensim/models/word2vec_inner.pyx"; static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; @@ -1628,7 +1628,7 @@ static PyObject *__pyx_n_s_expected; static PyObject *__pyx_n_s_fblas; static PyObject *__pyx_n_s_float32; static PyObject *__pyx_n_s_gensim_models_word2vec_inner; -static PyObject *__pyx_kp_s_home_ivan_release_gensim_gensim; +static PyObject *__pyx_kp_s_gensim_models_word2vec_inner_pyx; static PyObject *__pyx_n_s_hs; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_idx_end; @@ -1739,11 +1739,11 @@ static PyObject *__pyx_codeobj__22; static PyObject *__pyx_codeobj__24; /* "gensim/models/word2vec_inner.pyx":46 - * + * * # for when fblas.sdot returns a double * cdef REAL_t our_dot_double(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * return dsdot(N, X, incX, Y, incY) - * + * */ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_14word2vec_inner_our_dot_double(int const *__pyx_v_N, float const *__pyx_v_X, int const *__pyx_v_incX, float const *__pyx_v_Y, int const *__pyx_v_incY) { @@ -1753,18 +1753,18 @@ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_1 * # for when fblas.sdot returns a double * cdef REAL_t our_dot_double(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: * return dsdot(N, X, incX, Y, incY) # <<<<<<<<<<<<<< - * + * * # for when fblas.sdot returns a float */ __pyx_r = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)__pyx_v_6gensim_6models_14word2vec_inner_dsdot(__pyx_v_N, __pyx_v_X, __pyx_v_incX, __pyx_v_Y, __pyx_v_incY)); goto __pyx_L0; /* "gensim/models/word2vec_inner.pyx":46 - * + * * # for when fblas.sdot returns a double * cdef REAL_t our_dot_double(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * return dsdot(N, X, incX, Y, incY) - * + * */ /* function exit code */ @@ -1773,11 +1773,11 @@ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_1 } /* "gensim/models/word2vec_inner.pyx":50 - * + * * # for when fblas.sdot returns a float * cdef REAL_t our_dot_float(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * return sdot(N, X, incX, Y, incY) - * + * */ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_14word2vec_inner_our_dot_float(int const *__pyx_v_N, float const *__pyx_v_X, int const *__pyx_v_incX, float const *__pyx_v_Y, int const *__pyx_v_incY) { @@ -1787,18 +1787,18 @@ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_1 * # for when fblas.sdot returns a float * cdef REAL_t our_dot_float(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: * return sdot(N, X, incX, Y, incY) # <<<<<<<<<<<<<< - * + * * # for when no blas available */ __pyx_r = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)__pyx_v_6gensim_6models_14word2vec_inner_sdot(__pyx_v_N, __pyx_v_X, __pyx_v_incX, __pyx_v_Y, __pyx_v_incY)); goto __pyx_L0; /* "gensim/models/word2vec_inner.pyx":50 - * + * * # for when fblas.sdot returns a float * cdef REAL_t our_dot_float(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * return sdot(N, X, incX, Y, incY) - * + * */ /* function exit code */ @@ -1807,7 +1807,7 @@ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_1 } /* "gensim/models/word2vec_inner.pyx":54 - * + * * # for when no blas available * cdef REAL_t our_dot_noblas(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * # not a true full dot()-implementation: just enough for our cases @@ -1844,7 +1844,7 @@ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_1 * for i from 0 <= i < N[0] by 1: * a += X[i] * Y[i] # <<<<<<<<<<<<<< * return a - * + * */ __pyx_v_a = (__pyx_v_a + ((__pyx_v_X[__pyx_v_i]) * (__pyx_v_Y[__pyx_v_i]))); } @@ -1853,14 +1853,14 @@ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_1 * for i from 0 <= i < N[0] by 1: * a += X[i] * Y[i] * return a # <<<<<<<<<<<<<< - * + * * # for when no blas available */ __pyx_r = __pyx_v_a; goto __pyx_L0; /* "gensim/models/word2vec_inner.pyx":54 - * + * * # for when no blas available * cdef REAL_t our_dot_noblas(const int *N, const float *X, const int *incX, const float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * # not a true full dot()-implementation: just enough for our cases @@ -1873,7 +1873,7 @@ static __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_f_6gensim_6models_1 } /* "gensim/models/word2vec_inner.pyx":64 - * + * * # for when no blas available * cdef void our_saxpy_noblas(const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * cdef int i @@ -1889,7 +1889,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_our_saxpy_noblas(int const * cdef int i * for i from 0 <= i < N[0] by 1: # <<<<<<<<<<<<<< * Y[i * (incY[0])] = (alpha[0]) * X[i * (incX[0])] + Y[i * (incY[0])] - * + * */ __pyx_t_1 = (__pyx_v_N[0]); for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i+=1) { @@ -1898,14 +1898,14 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_our_saxpy_noblas(int const * cdef int i * for i from 0 <= i < N[0] by 1: * Y[i * (incY[0])] = (alpha[0]) * X[i * (incX[0])] + Y[i * (incY[0])] # <<<<<<<<<<<<<< - * - * + * + * */ (__pyx_v_Y[(__pyx_v_i * (__pyx_v_incY[0]))]) = (((__pyx_v_alpha[0]) * (__pyx_v_X[(__pyx_v_i * (__pyx_v_incX[0]))])) + (__pyx_v_Y[(__pyx_v_i * (__pyx_v_incY[0]))])); } /* "gensim/models/word2vec_inner.pyx":64 - * + * * # for when no blas available * cdef void our_saxpy_noblas(const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil: # <<<<<<<<<<<<<< * cdef int i @@ -1916,8 +1916,8 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_our_saxpy_noblas(int const } /* "gensim/models/word2vec_inner.pyx":70 - * - * + * + * * cdef void fast_sentence_sg_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, const int codelen, * REAL_t *syn0, REAL_t *syn1, const int size, @@ -1938,17 +1938,17 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t int __pyx_t_4; /* "gensim/models/word2vec_inner.pyx":77 - * + * * cdef long long a, b * cdef long long row1 = word2_index * size, row2, sgn # <<<<<<<<<<<<<< * cdef REAL_t f, g, f_dot, lprob - * + * */ __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); /* "gensim/models/word2vec_inner.pyx":80 * cdef REAL_t f, g, f_dot, lprob - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< * for b in range(codelen): * row2 = word_point[b] * size @@ -1956,7 +1956,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/word2vec_inner.pyx":81 - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) * for b in range(codelen): # <<<<<<<<<<<<<< * row2 = word_point[b] * size @@ -2025,7 +2025,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * g = (1 - word_code[b] - f) * alpha - * + * */ __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); @@ -2033,14 +2033,14 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * g = (1 - word_code[b] - f) * alpha # <<<<<<<<<<<<<< - * + * * if _compute_loss == 1: */ __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); /* "gensim/models/word2vec_inner.pyx":89 * g = (1 - word_code[b] - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 * lprob = -1*sgn*f_dot @@ -2049,7 +2049,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t if (__pyx_t_3) { /* "gensim/models/word2vec_inner.pyx":90 - * + * * if _compute_loss == 1: * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 # <<<<<<<<<<<<<< * lprob = -1*sgn*f_dot @@ -2107,7 +2107,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t * continue * lprob = LOG_TABLE[((lprob + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * _running_training_loss_param[0] = _running_training_loss_param[0] - lprob - * + * */ __pyx_v_lprob = (__pyx_v_6gensim_6models_14word2vec_inner_LOG_TABLE[((int)((__pyx_v_lprob + 6.0) * 83.0))]); @@ -2115,14 +2115,14 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t * continue * lprob = LOG_TABLE[((lprob + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * _running_training_loss_param[0] = _running_training_loss_param[0] - lprob # <<<<<<<<<<<<<< - * + * * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) */ (__pyx_v__running_training_loss_param[0]) = ((__pyx_v__running_training_loss_param[0]) - __pyx_v_lprob); /* "gensim/models/word2vec_inner.pyx":89 * g = (1 - word_code[b] - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 * lprob = -1*sgn*f_dot @@ -2131,18 +2131,18 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t /* "gensim/models/word2vec_inner.pyx":97 * _running_training_loss_param[0] = _running_training_loss_param[0] - lprob - * + * * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< * our_saxpy(&size, &g, &syn0[row1], &ONE, &syn1[row2], &ONE) - * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":98 - * + * * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) * our_saxpy(&size, &g, &syn0[row1], &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< - * + * * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -2151,16 +2151,16 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t /* "gensim/models/word2vec_inner.pyx":100 * our_saxpy(&size, &g, &syn0[row1], &ONE, &syn1[row2], &ONE) - * + * * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":70 - * - * + * + * * cdef void fast_sentence_sg_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, const int codelen, * REAL_t *syn0, REAL_t *syn1, const int size, @@ -2170,7 +2170,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_sg_hs(__pyx_t } /* "gensim/models/word2vec_inner.pyx":104 - * + * * # to support random draws from negative-sampling cum_table * cdef inline unsigned long long bisect_left(np.uint32_t *a, unsigned long long x, unsigned long long lo, unsigned long long hi) nogil: # <<<<<<<<<<<<<< * cdef unsigned long long mid @@ -2236,7 +2236,7 @@ static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_in * else: * lo = mid + 1 # <<<<<<<<<<<<<< * return lo - * + * */ /*else*/ { __pyx_v_lo = (__pyx_v_mid + 1); @@ -2248,14 +2248,14 @@ static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_in * else: * lo = mid + 1 * return lo # <<<<<<<<<<<<<< - * + * * # this quick & dirty RNG apparently matches Java's (non-Secure)Random */ __pyx_r = __pyx_v_lo; goto __pyx_L0; /* "gensim/models/word2vec_inner.pyx":104 - * + * * # to support random draws from negative-sampling cum_table * cdef inline unsigned long long bisect_left(np.uint32_t *a, unsigned long long x, unsigned long long lo, unsigned long long hi) nogil: # <<<<<<<<<<<<<< * cdef unsigned long long mid @@ -2293,7 +2293,7 @@ static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_in * cdef unsigned long long this_random = next_random[0] >> 16 * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL # <<<<<<<<<<<<<< * return this_random - * + * */ (__pyx_v_next_random[0]) = ((((__pyx_v_next_random[0]) * ((unsigned PY_LONG_LONG)25214903917ULL)) + 11) & 281474976710655ULL); @@ -2301,7 +2301,7 @@ static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_in * cdef unsigned long long this_random = next_random[0] >> 16 * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL * return this_random # <<<<<<<<<<<<<< - * + * * cdef unsigned long long fast_sentence_sg_neg( */ __pyx_r = __pyx_v_this_random; @@ -2322,7 +2322,7 @@ static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_in /* "gensim/models/word2vec_inner.pyx":121 * return this_random - * + * * cdef unsigned long long fast_sentence_sg_neg( # <<<<<<<<<<<<<< * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, * REAL_t *syn0, REAL_t *syn1neg, const int size, const np.uint32_t word_index, @@ -2347,7 +2347,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_t_6gensim_6models_14word2vec_inner_REAL_t __pyx_t_5; /* "gensim/models/word2vec_inner.pyx":129 - * + * * cdef long long a * cdef long long row1 = word2_index * size, row2 # <<<<<<<<<<<<<< * cdef unsigned long long modulo = 281474976710655ULL @@ -2366,16 +2366,16 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":135 * cdef int d - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< - * + * * for d in range(negative+1): */ memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/word2vec_inner.pyx":137 * memset(work, 0, size * cython.sizeof(REAL_t)) - * + * * for d in range(negative+1): # <<<<<<<<<<<<<< * if d == 0: * target_index = word_index @@ -2385,7 +2385,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_v_d = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":138 - * + * * for d in range(negative+1): * if d == 0: # <<<<<<<<<<<<<< * target_index = word_index @@ -2413,7 +2413,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_v_label = __pyx_v_6gensim_6models_14word2vec_inner_ONEF; /* "gensim/models/word2vec_inner.pyx":138 - * + * * for d in range(negative+1): * if d == 0: # <<<<<<<<<<<<<< * target_index = word_index @@ -2456,7 +2456,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * if target_index == word_index: * continue # <<<<<<<<<<<<<< * label = 0.0 - * + * */ goto __pyx_L3_continue; @@ -2473,7 +2473,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * if target_index == word_index: * continue * label = 0.0 # <<<<<<<<<<<<<< - * + * * row2 = target_index * size */ __pyx_v_label = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); @@ -2482,7 +2482,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":148 * label = 0.0 - * + * * row2 = target_index * size # <<<<<<<<<<<<<< * f_dot = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -2490,7 +2490,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); /* "gensim/models/word2vec_inner.pyx":149 - * + * * row2 = target_index * size * f_dot = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -2539,7 +2539,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * g = (label - f) * alpha - * + * */ __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); @@ -2547,14 +2547,14 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * g = (label - f) * alpha # <<<<<<<<<<<<<< - * + * * if _compute_loss == 1: */ __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); /* "gensim/models/word2vec_inner.pyx":155 * g = (label - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * f_dot = (f_dot if d == 0 else -f_dot) * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -2563,7 +2563,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente if (__pyx_t_3) { /* "gensim/models/word2vec_inner.pyx":156 - * + * * if _compute_loss == 1: * f_dot = (f_dot if d == 0 else -f_dot) # <<<<<<<<<<<<<< * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -2617,7 +2617,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * log_e_f_dot = LOG_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * _running_training_loss_param[0] = _running_training_loss_param[0] - log_e_f_dot - * + * */ __pyx_v_log_e_f_dot = (__pyx_v_6gensim_6models_14word2vec_inner_LOG_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); @@ -2625,14 +2625,14 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * log_e_f_dot = LOG_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * _running_training_loss_param[0] = _running_training_loss_param[0] - log_e_f_dot # <<<<<<<<<<<<<< - * + * * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) */ (__pyx_v__running_training_loss_param[0]) = ((__pyx_v__running_training_loss_param[0]) - __pyx_v_log_e_f_dot); /* "gensim/models/word2vec_inner.pyx":155 * g = (label - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * f_dot = (f_dot if d == 0 else -f_dot) * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -2641,18 +2641,18 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":162 * _running_training_loss_param[0] = _running_training_loss_param[0] - log_e_f_dot - * + * * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< * our_saxpy(&size, &g, &syn0[row1], &ONE, &syn1neg[row2], &ONE) - * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":163 - * + * * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) * our_saxpy(&size, &g, &syn0[row1], &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< - * + * * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -2661,26 +2661,26 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":165 * our_saxpy(&size, &g, &syn0[row1], &ONE, &syn1neg[row2], &ONE) - * + * * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) # <<<<<<<<<<<<<< - * + * * return next_random */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":167 * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) - * + * * return next_random # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_r = __pyx_v_next_random; goto __pyx_L0; /* "gensim/models/word2vec_inner.pyx":121 * return this_random - * + * * cdef unsigned long long fast_sentence_sg_neg( # <<<<<<<<<<<<<< * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, * REAL_t *syn0, REAL_t *syn1neg, const int size, const np.uint32_t word_index, @@ -2692,8 +2692,8 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente } /* "gensim/models/word2vec_inner.pyx":170 - * - * + * + * * cdef void fast_sentence_cbow_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, int codelens[MAX_SENTENCE_LEN], * REAL_t *neu1, REAL_t *syn0, REAL_t *syn1, const int size, @@ -2721,13 +2721,13 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * cdef long long row2, sgn * cdef REAL_t f, g, count, inv_count = 1.0, f_dot, lprob # <<<<<<<<<<<<<< * cdef int m - * + * */ __pyx_v_inv_count = 1.0; /* "gensim/models/word2vec_inner.pyx":182 * cdef int m - * + * * memset(neu1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< * count = 0.0 * for m in range(j, k): @@ -2735,7 +2735,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx memset(__pyx_v_neu1, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/word2vec_inner.pyx":183 - * + * * memset(neu1, 0, size * cython.sizeof(REAL_t)) * count = 0.0 # <<<<<<<<<<<<<< * for m in range(j, k): @@ -2837,7 +2837,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * inv_count = ONEF/count * if cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ __pyx_t_3 = (__pyx_v_cbow_mean != 0); if (__pyx_t_3) { @@ -2846,7 +2846,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * inv_count = ONEF/count * if cbow_mean: * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) # <<<<<<<<<<<<<< - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) */ __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -2856,13 +2856,13 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * inv_count = ONEF/count * if cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ } /* "gensim/models/word2vec_inner.pyx":195 * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< * for b in range(codelens[i]): * row2 = word_point[b] * size @@ -2870,7 +2870,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/word2vec_inner.pyx":196 - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) * for b in range(codelens[i]): # <<<<<<<<<<<<<< * row2 = word_point[b] * size @@ -2939,7 +2939,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * g = (1 - word_code[b] - f) * alpha - * + * */ __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); @@ -2947,14 +2947,14 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * g = (1 - word_code[b] - f) * alpha # <<<<<<<<<<<<<< - * + * * if _compute_loss == 1: */ __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); /* "gensim/models/word2vec_inner.pyx":204 * g = (1 - word_code[b] - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 * lprob = -1*sgn*f_dot @@ -2963,7 +2963,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx if (__pyx_t_3) { /* "gensim/models/word2vec_inner.pyx":205 - * + * * if _compute_loss == 1: * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 # <<<<<<<<<<<<<< * lprob = -1*sgn*f_dot @@ -3021,7 +3021,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * continue * lprob = LOG_TABLE[((lprob + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * _running_training_loss_param[0] = _running_training_loss_param[0] - lprob - * + * */ __pyx_v_lprob = (__pyx_v_6gensim_6models_14word2vec_inner_LOG_TABLE[((int)((__pyx_v_lprob + 6.0) * 83.0))]); @@ -3029,14 +3029,14 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * continue * lprob = LOG_TABLE[((lprob + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * _running_training_loss_param[0] = _running_training_loss_param[0] - lprob # <<<<<<<<<<<<<< - * + * * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) */ (__pyx_v__running_training_loss_param[0]) = ((__pyx_v__running_training_loss_param[0]) - __pyx_v_lprob); /* "gensim/models/word2vec_inner.pyx":204 * g = (1 - word_code[b] - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 * lprob = -1*sgn*f_dot @@ -3045,18 +3045,18 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx /* "gensim/models/word2vec_inner.pyx":212 * _running_training_loss_param[0] = _running_training_loss_param[0] - lprob - * + * * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) - * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":213 - * + * * our_saxpy(&size, &g, &syn1[row2], &ONE, work, &ONE) * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< - * + * * if not cbow_mean: # divide error over summed window vectors */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -3065,35 +3065,35 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx /* "gensim/models/word2vec_inner.pyx":215 * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) - * + * * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ __pyx_t_3 = ((!(__pyx_v_cbow_mean != 0)) != 0); if (__pyx_t_3) { /* "gensim/models/word2vec_inner.pyx":216 - * + * * if not cbow_mean: # divide error over summed window vectors * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) # <<<<<<<<<<<<<< - * + * * for m in range(j, k): */ __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":215 * our_saxpy(&size, &g, neu1, &ONE, &syn1[row2], &ONE) - * + * * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ } /* "gensim/models/word2vec_inner.pyx":218 * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) - * + * * for m in range(j, k): # <<<<<<<<<<<<<< * if m == i: * continue @@ -3103,7 +3103,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx __pyx_v_m = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":219 - * + * * for m in range(j, k): * if m == i: # <<<<<<<<<<<<<< * continue @@ -3122,7 +3122,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx goto __pyx_L18_continue; /* "gensim/models/word2vec_inner.pyx":219 - * + * * for m in range(j, k): * if m == i: # <<<<<<<<<<<<<< * continue @@ -3134,8 +3134,8 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx * continue * else: * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m] * size], &ONE) # <<<<<<<<<<<<<< - * - * + * + * */ /*else*/ { __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -3144,8 +3144,8 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx } /* "gensim/models/word2vec_inner.pyx":170 - * - * + * + * * cdef void fast_sentence_cbow_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, int codelens[MAX_SENTENCE_LEN], * REAL_t *neu1, REAL_t *syn0, REAL_t *syn1, const int size, @@ -3155,8 +3155,8 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_fast_sentence_cbow_hs(__pyx } /* "gensim/models/word2vec_inner.pyx":225 - * - * + * + * * cdef unsigned long long fast_sentence_cbow_neg( # <<<<<<<<<<<<<< * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, int codelens[MAX_SENTENCE_LEN], * REAL_t *neu1, REAL_t *syn0, REAL_t *syn1neg, const int size, @@ -3204,16 +3204,16 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":239 * cdef int d, m - * + * * word_index = indexes[i] # <<<<<<<<<<<<<< - * + * * memset(neu1, 0, size * cython.sizeof(REAL_t)) */ __pyx_v_word_index = (__pyx_v_indexes[__pyx_v_i]); /* "gensim/models/word2vec_inner.pyx":241 * word_index = indexes[i] - * + * * memset(neu1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< * count = 0.0 * for m in range(j, k): @@ -3221,7 +3221,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente memset(__pyx_v_neu1, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/word2vec_inner.pyx":242 - * + * * memset(neu1, 0, size * cython.sizeof(REAL_t)) * count = 0.0 # <<<<<<<<<<<<<< * for m in range(j, k): @@ -3323,7 +3323,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * inv_count = ONEF/count * if cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ __pyx_t_3 = (__pyx_v_cbow_mean != 0); if (__pyx_t_3) { @@ -3332,7 +3332,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * inv_count = ONEF/count * if cbow_mean: * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) # <<<<<<<<<<<<<< - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) */ __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -3342,22 +3342,22 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * inv_count = ONEF/count * if cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ } /* "gensim/models/word2vec_inner.pyx":254 * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) - * + * * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< - * + * * for d in range(negative+1): */ memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/word2vec_inner.pyx":256 * memset(work, 0, size * cython.sizeof(REAL_t)) - * + * * for d in range(negative+1): # <<<<<<<<<<<<<< * if d == 0: * target_index = word_index @@ -3367,7 +3367,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_v_d = __pyx_t_1; /* "gensim/models/word2vec_inner.pyx":257 - * + * * for d in range(negative+1): * if d == 0: # <<<<<<<<<<<<<< * target_index = word_index @@ -3395,7 +3395,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_v_label = __pyx_v_6gensim_6models_14word2vec_inner_ONEF; /* "gensim/models/word2vec_inner.pyx":257 - * + * * for d in range(negative+1): * if d == 0: # <<<<<<<<<<<<<< * target_index = word_index @@ -3438,7 +3438,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * if target_index == word_index: * continue # <<<<<<<<<<<<<< * label = 0.0 - * + * */ goto __pyx_L8_continue; @@ -3455,7 +3455,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * if target_index == word_index: * continue * label = 0.0 # <<<<<<<<<<<<<< - * + * * row2 = target_index * size */ __pyx_v_label = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)0.0); @@ -3464,7 +3464,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":267 * label = 0.0 - * + * * row2 = target_index * size # <<<<<<<<<<<<<< * f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -3472,7 +3472,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); /* "gensim/models/word2vec_inner.pyx":268 - * + * * row2 = target_index * size * f_dot = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -3521,7 +3521,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * g = (label - f) * alpha - * + * */ __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); @@ -3529,14 +3529,14 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * f = EXP_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * g = (label - f) * alpha # <<<<<<<<<<<<<< - * + * * if _compute_loss == 1: */ __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); /* "gensim/models/word2vec_inner.pyx":274 * g = (label - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * f_dot = (f_dot if d == 0 else -f_dot) * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -3545,7 +3545,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente if (__pyx_t_3) { /* "gensim/models/word2vec_inner.pyx":275 - * + * * if _compute_loss == 1: * f_dot = (f_dot if d == 0 else -f_dot) # <<<<<<<<<<<<<< * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -3599,7 +3599,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * log_e_f_dot = LOG_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * _running_training_loss_param[0] = _running_training_loss_param[0] - log_e_f_dot - * + * */ __pyx_v_log_e_f_dot = (__pyx_v_6gensim_6models_14word2vec_inner_LOG_TABLE[((int)((__pyx_v_f_dot + 6.0) * 83.0))]); @@ -3607,14 +3607,14 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * log_e_f_dot = LOG_TABLE[((f_dot + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * _running_training_loss_param[0] = _running_training_loss_param[0] - log_e_f_dot # <<<<<<<<<<<<<< - * + * * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) */ (__pyx_v__running_training_loss_param[0]) = ((__pyx_v__running_training_loss_param[0]) - __pyx_v_log_e_f_dot); /* "gensim/models/word2vec_inner.pyx":274 * g = (label - f) * alpha - * + * * if _compute_loss == 1: # <<<<<<<<<<<<<< * f_dot = (f_dot if d == 0 else -f_dot) * if f_dot <= -MAX_EXP or f_dot >= MAX_EXP: @@ -3623,18 +3623,18 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":281 * _running_training_loss_param[0] = _running_training_loss_param[0] - log_e_f_dot - * + * * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) # <<<<<<<<<<<<<< * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":282 - * + * * our_saxpy(&size, &g, &syn1neg[row2], &ONE, work, &ONE) * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< - * + * * if not cbow_mean: # divide error over summed window vectors */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -3643,35 +3643,35 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":284 * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ __pyx_t_3 = ((!(__pyx_v_cbow_mean != 0)) != 0); if (__pyx_t_3) { /* "gensim/models/word2vec_inner.pyx":285 - * + * * if not cbow_mean: # divide error over summed window vectors * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) # <<<<<<<<<<<<<< - * + * * for m in range(j,k): */ __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); /* "gensim/models/word2vec_inner.pyx":284 * our_saxpy(&size, &g, neu1, &ONE, &syn1neg[row2], &ONE) - * + * * if not cbow_mean: # divide error over summed window vectors # <<<<<<<<<<<<<< * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) - * + * */ } /* "gensim/models/word2vec_inner.pyx":287 * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) - * + * * for m in range(j,k): # <<<<<<<<<<<<<< * if m == i: * continue @@ -3681,7 +3681,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente __pyx_v_m = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":288 - * + * * for m in range(j,k): * if m == i: # <<<<<<<<<<<<<< * continue @@ -3700,7 +3700,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente goto __pyx_L20_continue; /* "gensim/models/word2vec_inner.pyx":288 - * + * * for m in range(j,k): * if m == i: # <<<<<<<<<<<<<< * continue @@ -3712,7 +3712,7 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente * continue * else: * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) # <<<<<<<<<<<<<< - * + * * return next_random */ /*else*/ { @@ -3723,17 +3723,17 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente /* "gensim/models/word2vec_inner.pyx":293 * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) - * + * * return next_random # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_r = __pyx_v_next_random; goto __pyx_L0; /* "gensim/models/word2vec_inner.pyx":225 - * - * + * + * * cdef unsigned long long fast_sentence_cbow_neg( # <<<<<<<<<<<<<< * const int negative, np.uint32_t *cum_table, unsigned long long cum_table_len, int codelens[MAX_SENTENCE_LEN], * REAL_t *neu1, REAL_t *syn0, REAL_t *syn1neg, const int size, @@ -3745,8 +3745,8 @@ static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_14word2vec_inner_fast_sente } /* "gensim/models/word2vec_inner.pyx":296 - * - * + * + * * def train_batch_sg(model, sentences, alpha, _work, compute_loss): # <<<<<<<<<<<<<< * cdef int hs = model.hs * cdef int negative = model.negative @@ -3901,7 +3901,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON __Pyx_RefNannySetupContext("train_batch_sg", 0); /* "gensim/models/word2vec_inner.pyx":297 - * + * * def train_batch_sg(model, sentences, alpha, _work, compute_loss): * cdef int hs = model.hs # <<<<<<<<<<<<<< * cdef int negative = model.negative @@ -3918,7 +3918,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cdef int hs = model.hs * cdef int negative = model.negative # <<<<<<<<<<<<<< * cdef int sample = (model.sample != 0) - * + * */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_negative); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 298, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); @@ -3930,7 +3930,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cdef int hs = model.hs * cdef int negative = model.negative * cdef int sample = (model.sample != 0) # <<<<<<<<<<<<<< - * + * * cdef int _compute_loss = (1 if compute_loss == True else 0) */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_sample); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 299, __pyx_L1_error) @@ -3943,10 +3943,10 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON /* "gensim/models/word2vec_inner.pyx":301 * cdef int sample = (model.sample != 0) - * + * * cdef int _compute_loss = (1 if compute_loss == True else 0) # <<<<<<<<<<<<<< * cdef REAL_t _running_training_loss = model.running_training_loss - * + * */ __pyx_t_3 = PyObject_RichCompare(__pyx_v_compute_loss, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error) __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 301, __pyx_L1_error) @@ -3959,10 +3959,10 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON __pyx_v__compute_loss = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":302 - * + * * cdef int _compute_loss = (1 if compute_loss == True else 0) * cdef REAL_t _running_training_loss = model.running_training_loss # <<<<<<<<<<<<<< - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_running_training_loss); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 302, __pyx_L1_error) @@ -3973,7 +3973,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON /* "gensim/models/word2vec_inner.pyx":304 * cdef REAL_t _running_training_loss = model.running_training_loss - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) # <<<<<<<<<<<<<< * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) * cdef REAL_t *work @@ -3988,7 +3988,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":305 - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) # <<<<<<<<<<<<<< * cdef REAL_t *work @@ -4005,7 +4005,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cdef REAL_t *work * cdef REAL_t _alpha = alpha # <<<<<<<<<<<<<< * cdef int size = model.layer1_size - * + * */ __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_v_alpha); if (unlikely((__pyx_t_5 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 307, __pyx_L1_error) __pyx_v__alpha = __pyx_t_5; @@ -4014,7 +4014,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cdef REAL_t *work * cdef REAL_t _alpha = alpha * cdef int size = model.layer1_size # <<<<<<<<<<<<<< - * + * * cdef int codelens[MAX_SENTENCE_LEN] */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 308, __pyx_L1_error) @@ -4027,7 +4027,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cdef np.uint32_t reduced_windows[MAX_SENTENCE_LEN] * cdef int sentence_idx[MAX_SENTENCE_LEN + 1] * cdef int window = model.window # <<<<<<<<<<<<<< - * + * * cdef int i, j, k */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 314, __pyx_L1_error) @@ -4037,30 +4037,30 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON __pyx_v_window = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":317 - * + * * cdef int i, j, k * cdef int effective_words = 0, effective_sentences = 0 # <<<<<<<<<<<<<< * cdef int sent_idx, idx_start, idx_end - * + * */ __pyx_v_effective_words = 0; __pyx_v_effective_sentences = 0; /* "gensim/models/word2vec_inner.pyx":332 * cdef unsigned long long next_random - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ __pyx_t_4 = (__pyx_v_hs != 0); if (__pyx_t_4) { /* "gensim/models/word2vec_inner.pyx":333 - * + * * if hs: * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< - * + * * if negative: */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 333, __pyx_L1_error) @@ -4071,16 +4071,16 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON /* "gensim/models/word2vec_inner.pyx":332 * cdef unsigned long long next_random - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ } /* "gensim/models/word2vec_inner.pyx":335 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -4089,7 +4089,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON if (__pyx_t_4) { /* "gensim/models/word2vec_inner.pyx":336 - * + * * if negative: * syn1neg = (np.PyArray_DATA(model.syn1neg)) # <<<<<<<<<<<<<< * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -4129,7 +4129,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON /* "gensim/models/word2vec_inner.pyx":335 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -4141,7 +4141,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ __pyx_t_7 = (__pyx_v_negative != 0); if (!__pyx_t_7) { @@ -4158,7 +4158,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 340, __pyx_L1_error) @@ -4193,22 +4193,22 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ } /* "gensim/models/word2vec_inner.pyx":343 - * + * * # convert Python structures to primitive types, so we can release the GIL * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< - * + * * # prepare C structures so we can go "full C" and release the Python GIL */ if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 343, __pyx_L1_error) __pyx_v_work = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); /* "gensim/models/word2vec_inner.pyx":346 - * + * * # prepare C structures so we can go "full C" and release the Python GIL * vlookup = model.wv.vocab # <<<<<<<<<<<<<< * sentence_idx[0] = 0 # indices of the first sentence always start at 0 @@ -4536,7 +4536,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * effective_words += 1 * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< * break # TODO: log warning, tally overflow? - * + * */ __pyx_t_4 = ((__pyx_v_effective_words == 0x2710) != 0); if (__pyx_t_4) { @@ -4545,7 +4545,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * effective_words += 1 * if effective_words == MAX_SENTENCE_LEN: * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< - * + * * # keep track of which words go into which sentence, so we don't train */ goto __pyx_L12_break; @@ -4555,7 +4555,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * effective_words += 1 * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< * break # TODO: log warning, tally overflow? - * + * */ } @@ -4576,7 +4576,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_train_batch_sg(CYTHON * # indices of sentence number X are between (np.PyArray_DATA(model.wv.syn0)) */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_running_training_loss); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 410, __pyx_L1_error) @@ -5315,7 +5315,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT /* "gensim/models/word2vec_inner.pyx":412 * cdef REAL_t _running_training_loss = model.running_training_loss - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) # <<<<<<<<<<<<<< * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) * cdef REAL_t *work @@ -5330,7 +5330,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":413 - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) # <<<<<<<<<<<<<< * cdef REAL_t *work @@ -5347,7 +5347,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * cdef REAL_t *work * cdef REAL_t _alpha = alpha # <<<<<<<<<<<<<< * cdef int size = model.layer1_size - * + * */ __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_v_alpha); if (unlikely((__pyx_t_5 == ((npy_float32)-1)) && PyErr_Occurred())) __PYX_ERR(0, 415, __pyx_L1_error) __pyx_v__alpha = __pyx_t_5; @@ -5356,7 +5356,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * cdef REAL_t *work * cdef REAL_t _alpha = alpha * cdef int size = model.layer1_size # <<<<<<<<<<<<<< - * + * * cdef int codelens[MAX_SENTENCE_LEN] */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 416, __pyx_L1_error) @@ -5369,7 +5369,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * cdef np.uint32_t reduced_windows[MAX_SENTENCE_LEN] * cdef int sentence_idx[MAX_SENTENCE_LEN + 1] * cdef int window = model.window # <<<<<<<<<<<<<< - * + * * cdef int i, j, k */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error) @@ -5379,30 +5379,30 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT __pyx_v_window = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":425 - * + * * cdef int i, j, k * cdef int effective_words = 0, effective_sentences = 0 # <<<<<<<<<<<<<< * cdef int sent_idx, idx_start, idx_end - * + * */ __pyx_v_effective_words = 0; __pyx_v_effective_sentences = 0; /* "gensim/models/word2vec_inner.pyx":440 * cdef unsigned long long next_random - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ __pyx_t_4 = (__pyx_v_hs != 0); if (__pyx_t_4) { /* "gensim/models/word2vec_inner.pyx":441 - * + * * if hs: * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< - * + * * if negative: */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 441, __pyx_L1_error) @@ -5413,16 +5413,16 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT /* "gensim/models/word2vec_inner.pyx":440 * cdef unsigned long long next_random - * + * * if hs: # <<<<<<<<<<<<<< * syn1 = (np.PyArray_DATA(model.syn1)) - * + * */ } /* "gensim/models/word2vec_inner.pyx":443 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -5431,7 +5431,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT if (__pyx_t_4) { /* "gensim/models/word2vec_inner.pyx":444 - * + * * if negative: * syn1neg = (np.PyArray_DATA(model.syn1neg)) # <<<<<<<<<<<<<< * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -5471,7 +5471,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT /* "gensim/models/word2vec_inner.pyx":443 * syn1 = (np.PyArray_DATA(model.syn1)) - * + * * if negative: # <<<<<<<<<<<<<< * syn1neg = (np.PyArray_DATA(model.syn1neg)) * cum_table = (np.PyArray_DATA(model.cum_table)) @@ -5483,7 +5483,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ __pyx_t_7 = (__pyx_v_negative != 0); if (!__pyx_t_7) { @@ -5500,7 +5500,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_random); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 448, __pyx_L1_error) @@ -5535,16 +5535,16 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * cum_table_len = len(model.cum_table) * if negative or sample: # <<<<<<<<<<<<<< * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) - * + * */ } /* "gensim/models/word2vec_inner.pyx":451 - * + * * # convert Python structures to primitive types, so we can release the GIL * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< * neu1 = np.PyArray_DATA(_neu1) - * + * */ if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 451, __pyx_L1_error) __pyx_v_work = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); @@ -5553,14 +5553,14 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * # convert Python structures to primitive types, so we can release the GIL * work = np.PyArray_DATA(_work) * neu1 = np.PyArray_DATA(_neu1) # <<<<<<<<<<<<<< - * + * * # prepare C structures so we can go "full C" and release the Python GIL */ if (!(likely(((__pyx_v__neu1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__neu1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 452, __pyx_L1_error) __pyx_v_neu1 = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__neu1))); /* "gensim/models/word2vec_inner.pyx":455 - * + * * # prepare C structures so we can go "full C" and release the Python GIL * vlookup = model.wv.vocab # <<<<<<<<<<<<<< * sentence_idx[0] = 0 # indices of the first sentence always start at 0 @@ -5888,7 +5888,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * effective_words += 1 * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< * break # TODO: log warning, tally overflow? - * + * */ __pyx_t_4 = ((__pyx_v_effective_words == 0x2710) != 0); if (__pyx_t_4) { @@ -5897,7 +5897,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * effective_words += 1 * if effective_words == MAX_SENTENCE_LEN: * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< - * + * * # keep track of which words go into which sentence, so we don't train */ goto __pyx_L12_break; @@ -5907,7 +5907,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * effective_words += 1 * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< * break # TODO: log warning, tally overflow? - * + * */ } @@ -5928,7 +5928,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_2train_batch_cbow(CYT * # indices of sentence number X are between (np.PyArray_DATA(model.wv.syn0)) */ @@ -6488,7 +6488,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY /* "gensim/models/word2vec_inner.pyx":512 * def score_sentence_sg(model, sentence, _work): - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) # <<<<<<<<<<<<<< * cdef REAL_t *work * cdef int size = model.layer1_size @@ -6506,7 +6506,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) * cdef REAL_t *work * cdef int size = model.layer1_size # <<<<<<<<<<<<<< - * + * * cdef int codelens[MAX_SENTENCE_LEN] */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 514, __pyx_L1_error) @@ -6519,7 +6519,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY * cdef np.uint32_t indexes[MAX_SENTENCE_LEN] * cdef int sentence_len * cdef int window = model.window # <<<<<<<<<<<<<< - * + * * cdef int i, j, k */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 519, __pyx_L1_error) @@ -6529,19 +6529,19 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY __pyx_v_window = __pyx_t_3; /* "gensim/models/word2vec_inner.pyx":522 - * + * * cdef int i, j, k * cdef long result = 0 # <<<<<<<<<<<<<< - * + * * cdef REAL_t *syn1 */ __pyx_v_result = 0; /* "gensim/models/word2vec_inner.pyx":528 * cdef np.uint8_t *codes[MAX_SENTENCE_LEN] - * + * * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 528, __pyx_L1_error) @@ -6551,10 +6551,10 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "gensim/models/word2vec_inner.pyx":531 - * + * * # convert Python structures to primitive types, so we can release the GIL * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< - * + * * vlookup = model.wv.vocab */ if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 531, __pyx_L1_error) @@ -6562,7 +6562,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY /* "gensim/models/word2vec_inner.pyx":533 * work = np.PyArray_DATA(_work) - * + * * vlookup = model.wv.vocab # <<<<<<<<<<<<<< * i = 0 * for token in sentence: @@ -6576,7 +6576,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":534 - * + * * vlookup = model.wv.vocab * i = 0 # <<<<<<<<<<<<<< * for token in sentence: @@ -6767,7 +6767,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY * if i == MAX_SENTENCE_LEN: * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< * sentence_len = i - * + * */ goto __pyx_L4_break; @@ -6796,23 +6796,23 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY * if i == MAX_SENTENCE_LEN: * break # TODO: log warning, tally overflow? * sentence_len = i # <<<<<<<<<<<<<< - * + * * # release GIL & train on the sentence */ __pyx_v_sentence_len = __pyx_v_i; /* "gensim/models/word2vec_inner.pyx":550 - * + * * # release GIL & train on the sentence * work[0] = 0.0 # <<<<<<<<<<<<<< - * + * * with nogil: */ (__pyx_v_work[0]) = 0.0; /* "gensim/models/word2vec_inner.pyx":552 * work[0] = 0.0 - * + * * with nogil: # <<<<<<<<<<<<<< * for i in range(sentence_len): * if codelens[i] == 0: @@ -6825,7 +6825,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY /*try:*/ { /* "gensim/models/word2vec_inner.pyx":553 - * + * * with nogil: * for i in range(sentence_len): # <<<<<<<<<<<<<< * if codelens[i] == 0: @@ -6971,7 +6971,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY * if j == i or codelens[j] == 0: * continue # <<<<<<<<<<<<<< * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) - * + * */ goto __pyx_L15_continue; @@ -6988,7 +6988,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY * if j == i or codelens[j] == 0: * continue * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) # <<<<<<<<<<<<<< - * + * * return work[0] */ __pyx_f_6gensim_6models_14word2vec_inner_score_pair_sg_hs((__pyx_v_points[__pyx_v_i]), (__pyx_v_codes[__pyx_v_i]), (__pyx_v_codelens[__pyx_v_i]), __pyx_v_syn0, __pyx_v_syn1, __pyx_v_size, (__pyx_v_indexes[__pyx_v_j]), __pyx_v_work); @@ -7000,7 +7000,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY /* "gensim/models/word2vec_inner.pyx":552 * work[0] = 0.0 - * + * * with nogil: # <<<<<<<<<<<<<< * for i in range(sentence_len): * if codelens[i] == 0: @@ -7018,9 +7018,9 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY /* "gensim/models/word2vec_inner.pyx":567 * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) - * + * * return work[0] # <<<<<<<<<<<<<< - * + * * cdef void score_pair_sg_hs( */ __Pyx_XDECREF(__pyx_r); @@ -7031,10 +7031,10 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY goto __pyx_L0; /* "gensim/models/word2vec_inner.pyx":510 - * + * * # Score is only implemented for hierarchical softmax * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) */ @@ -7056,7 +7056,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_4score_sentence_sg(CY /* "gensim/models/word2vec_inner.pyx":569 * return work[0] - * + * * cdef void score_pair_sg_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, const int codelen, * REAL_t *syn0, REAL_t *syn1, const int size, @@ -7075,17 +7075,17 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_sg_hs(__pyx_t_5n long __pyx_t_5; /* "gensim/models/word2vec_inner.pyx":575 - * + * * cdef long long b * cdef long long row1 = word2_index * size, row2, sgn # <<<<<<<<<<<<<< * cdef REAL_t f - * + * */ __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); /* "gensim/models/word2vec_inner.pyx":578 * cdef REAL_t f - * + * * for b in range(codelen): # <<<<<<<<<<<<<< * row2 = word_point[b] * size * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) @@ -7095,7 +7095,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_sg_hs(__pyx_t_5n __pyx_v_b = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":579 - * + * * for b in range(codelen): * row2 = word_point[b] * size # <<<<<<<<<<<<<< * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) @@ -7171,7 +7171,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_sg_hs(__pyx_t_5n * continue * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * work[0] += f - * + * */ __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_LOG_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); @@ -7179,7 +7179,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_sg_hs(__pyx_t_5n * continue * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * work[0] += f # <<<<<<<<<<<<<< - * + * * def score_sentence_cbow(model, sentence, _work, _neu1): */ __pyx_t_5 = 0; @@ -7189,7 +7189,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_sg_hs(__pyx_t_5n /* "gensim/models/word2vec_inner.pyx":569 * return work[0] - * + * * cdef void score_pair_sg_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, const int codelen, * REAL_t *syn0, REAL_t *syn1, const int size, @@ -7200,9 +7200,9 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_sg_hs(__pyx_t_5n /* "gensim/models/word2vec_inner.pyx":588 * work[0] += f - * + * * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< - * + * * cdef int cbow_mean = model.cbow_mean */ @@ -7320,9 +7320,9 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( /* "gensim/models/word2vec_inner.pyx":590 * def score_sentence_cbow(model, sentence, _work, _neu1): - * + * * cdef int cbow_mean = model.cbow_mean # <<<<<<<<<<<<<< - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cbow_mean); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 590, __pyx_L1_error) @@ -7333,7 +7333,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( /* "gensim/models/word2vec_inner.pyx":592 * cdef int cbow_mean = model.cbow_mean - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) # <<<<<<<<<<<<<< * cdef REAL_t *work * cdef REAL_t *neu1 @@ -7351,7 +7351,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( * cdef REAL_t *work * cdef REAL_t *neu1 * cdef int size = model.layer1_size # <<<<<<<<<<<<<< - * + * * cdef int codelens[MAX_SENTENCE_LEN] */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 595, __pyx_L1_error) @@ -7364,7 +7364,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( * cdef np.uint32_t indexes[MAX_SENTENCE_LEN] * cdef int sentence_len * cdef int window = model.window # <<<<<<<<<<<<<< - * + * * cdef int i, j, k */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 600, __pyx_L1_error) @@ -7374,19 +7374,19 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( __pyx_v_window = __pyx_t_2; /* "gensim/models/word2vec_inner.pyx":603 - * + * * cdef int i, j, k * cdef long result = 0 # <<<<<<<<<<<<<< - * + * * # For hierarchical softmax */ __pyx_v_result = 0; /* "gensim/models/word2vec_inner.pyx":610 * cdef np.uint8_t *codes[MAX_SENTENCE_LEN] - * + * * syn1 = (np.PyArray_DATA(model.syn1)) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error) @@ -7396,11 +7396,11 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "gensim/models/word2vec_inner.pyx":613 - * + * * # convert Python structures to primitive types, so we can release the GIL * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< * neu1 = np.PyArray_DATA(_neu1) - * + * */ if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 613, __pyx_L1_error) __pyx_v_work = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); @@ -7409,7 +7409,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( * # convert Python structures to primitive types, so we can release the GIL * work = np.PyArray_DATA(_work) * neu1 = np.PyArray_DATA(_neu1) # <<<<<<<<<<<<<< - * + * * vlookup = model.wv.vocab */ if (!(likely(((__pyx_v__neu1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__neu1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 614, __pyx_L1_error) @@ -7417,7 +7417,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( /* "gensim/models/word2vec_inner.pyx":616 * neu1 = np.PyArray_DATA(_neu1) - * + * * vlookup = model.wv.vocab # <<<<<<<<<<<<<< * i = 0 * for token in sentence: @@ -7431,7 +7431,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":617 - * + * * vlookup = model.wv.vocab * i = 0 # <<<<<<<<<<<<<< * for token in sentence: @@ -7622,7 +7622,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( * if i == MAX_SENTENCE_LEN: * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< * sentence_len = i - * + * */ goto __pyx_L4_break; @@ -7651,13 +7651,13 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( * if i == MAX_SENTENCE_LEN: * break # TODO: log warning, tally overflow? * sentence_len = i # <<<<<<<<<<<<<< - * + * * # release GIL & train on the sentence */ __pyx_v_sentence_len = __pyx_v_i; /* "gensim/models/word2vec_inner.pyx":633 - * + * * # release GIL & train on the sentence * work[0] = 0.0 # <<<<<<<<<<<<<< * with nogil: @@ -7779,7 +7779,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( * if k > sentence_len: * k = sentence_len # <<<<<<<<<<<<<< * score_pair_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, work, i, j, k, cbow_mean) - * + * */ __pyx_v_k = __pyx_v_sentence_len; @@ -7796,7 +7796,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( * if k > sentence_len: * k = sentence_len * score_pair_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, work, i, j, k, cbow_mean) # <<<<<<<<<<<<<< - * + * * return work[0] */ __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs((__pyx_v_points[__pyx_v_i]), (__pyx_v_codes[__pyx_v_i]), __pyx_v_codelens, __pyx_v_neu1, __pyx_v_syn0, __pyx_v_syn1, __pyx_v_size, __pyx_v_indexes, __pyx_v_work, __pyx_v_i, __pyx_v_j, __pyx_v_k, __pyx_v_cbow_mean); @@ -7824,9 +7824,9 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( /* "gensim/models/word2vec_inner.pyx":646 * score_pair_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, work, i, j, k, cbow_mean) - * + * * return work[0] # <<<<<<<<<<<<<< - * + * * cdef void score_pair_cbow_hs( */ __Pyx_XDECREF(__pyx_r); @@ -7838,9 +7838,9 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( /* "gensim/models/word2vec_inner.pyx":588 * work[0] += f - * + * * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< - * + * * cdef int cbow_mean = model.cbow_mean */ @@ -7862,7 +7862,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_6score_sentence_cbow( /* "gensim/models/word2vec_inner.pyx":648 * return work[0] - * + * * cdef void score_pair_cbow_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, int codelens[MAX_SENTENCE_LEN], * REAL_t *neu1, REAL_t *syn0, REAL_t *syn1, const int size, @@ -7885,7 +7885,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ /* "gensim/models/word2vec_inner.pyx":659 * cdef int m - * + * * memset(neu1, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< * count = 0.0 * for m in range(j, k): @@ -7893,7 +7893,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ memset(__pyx_v_neu1, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)))); /* "gensim/models/word2vec_inner.pyx":660 - * + * * memset(neu1, 0, size * cython.sizeof(REAL_t)) * count = 0.0 # <<<<<<<<<<<<<< * for m in range(j, k): @@ -8003,7 +8003,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ * inv_count = ONEF/count * if cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, neu1, &ONE) - * + * */ __pyx_t_3 = (__pyx_v_cbow_mean != 0); if (__pyx_t_3) { @@ -8012,7 +8012,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ * inv_count = ONEF/count * if cbow_mean: * sscal(&size, &inv_count, neu1, &ONE) # <<<<<<<<<<<<<< - * + * * for b in range(codelens[i]): */ __pyx_v_6gensim_6models_14word2vec_inner_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_14word2vec_inner_ONE)); @@ -8022,13 +8022,13 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ * inv_count = ONEF/count * if cbow_mean: # <<<<<<<<<<<<<< * sscal(&size, &inv_count, neu1, &ONE) - * + * */ } /* "gensim/models/word2vec_inner.pyx":672 * sscal(&size, &inv_count, neu1, &ONE) - * + * * for b in range(codelens[i]): # <<<<<<<<<<<<<< * row2 = word_point[b] * size * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) @@ -8038,7 +8038,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ __pyx_v_b = __pyx_t_5; /* "gensim/models/word2vec_inner.pyx":673 - * + * * for b in range(codelens[i]): * row2 = word_point[b] * size # <<<<<<<<<<<<<< * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) @@ -8114,7 +8114,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ * continue * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< * work[0] += f - * + * */ __pyx_v_f = (__pyx_v_6gensim_6models_14word2vec_inner_LOG_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); @@ -8122,8 +8122,8 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ * continue * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] * work[0] += f # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_t_6 = 0; (__pyx_v_work[__pyx_t_6]) = ((__pyx_v_work[__pyx_t_6]) + __pyx_v_f); @@ -8132,7 +8132,7 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ /* "gensim/models/word2vec_inner.pyx":648 * return work[0] - * + * * cdef void score_pair_cbow_hs( # <<<<<<<<<<<<<< * const np.uint32_t *word_point, const np.uint8_t *word_code, int codelens[MAX_SENTENCE_LEN], * REAL_t *neu1, REAL_t *syn0, REAL_t *syn1, const int size, @@ -8142,8 +8142,8 @@ static void __pyx_f_6gensim_6models_14word2vec_inner_score_pair_cbow_hs(__pyx_t_ } /* "gensim/models/word2vec_inner.pyx":683 - * - * + * + * * def init(): # <<<<<<<<<<<<<< * """ * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized @@ -8181,7 +8181,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_8init(CYTHON_UNUSED P __Pyx_RefNannySetupContext("init", 0); /* "gensim/models/word2vec_inner.pyx":693 - * + * * cdef int i * cdef float *x = [10.0] # <<<<<<<<<<<<<< * cdef float *y = [0.01] @@ -8219,7 +8219,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_8init(CYTHON_UNUSED P __pyx_v_size = 1; /* "gensim/models/word2vec_inner.pyx":701 - * + * * # build the sigmoid table * for i in range(EXP_TABLE_SIZE): # <<<<<<<<<<<<<< * EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) @@ -8242,7 +8242,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_8init(CYTHON_UNUSED P * EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) * EXP_TABLE[i] = (EXP_TABLE[i] / (EXP_TABLE[i] + 1)) # <<<<<<<<<<<<<< * LOG_TABLE[i] = log( EXP_TABLE[i] ) - * + * */ (__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)((__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]) / ((__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]) + 1.0))); @@ -8250,14 +8250,14 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_8init(CYTHON_UNUSED P * EXP_TABLE[i] = exp((i / EXP_TABLE_SIZE * 2 - 1) * MAX_EXP) * EXP_TABLE[i] = (EXP_TABLE[i] / (EXP_TABLE[i] + 1)) * LOG_TABLE[i] = log( EXP_TABLE[i] ) # <<<<<<<<<<<<<< - * + * * # check whether sdot returns double or float */ (__pyx_v_6gensim_6models_14word2vec_inner_LOG_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)log((__pyx_v_6gensim_6models_14word2vec_inner_EXP_TABLE[__pyx_v_i]))); } /* "gensim/models/word2vec_inner.pyx":707 - * + * * # check whether sdot returns double or float * d_res = dsdot(&size, x, &ONE, y, &ONE) # <<<<<<<<<<<<<< * p_res = &d_res @@ -8387,7 +8387,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_8init(CYTHON_UNUSED P * our_dot = our_dot_noblas * our_saxpy = our_saxpy_noblas # <<<<<<<<<<<<<< * return 2 - * + * */ __pyx_v_6gensim_6models_14word2vec_inner_our_saxpy = __pyx_f_6gensim_6models_14word2vec_inner_our_saxpy_noblas; @@ -8395,7 +8395,7 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_8init(CYTHON_UNUSED P * our_dot = our_dot_noblas * our_saxpy = our_saxpy_noblas * return 2 # <<<<<<<<<<<<<< - * + * * FAST_VERSION = init() # initialize the module */ __Pyx_XDECREF(__pyx_r); @@ -8405,8 +8405,8 @@ static PyObject *__pyx_pf_6gensim_6models_14word2vec_inner_8init(CYTHON_UNUSED P } /* "gensim/models/word2vec_inner.pyx":683 - * - * + * + * * def init(): # <<<<<<<<<<<<<< * """ * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized @@ -8468,9 +8468,9 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":203 * # of flags - * + * * if info == NULL: return # <<<<<<<<<<<<<< - * + * * cdef int copy_shape, i, ndim */ __pyx_t_1 = ((__pyx_v_info == NULL) != 0); @@ -8480,11 +8480,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":206 - * + * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) - * + * */ __pyx_v_endian_detector = 1; @@ -8492,23 +8492,23 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< - * + * * ndim = PyArray_NDIM(self) */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":209 * cdef bint little_endian = ((&endian_detector)[0] != 0) - * + * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: @@ -8517,7 +8517,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P if (__pyx_t_1) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":212 - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< * else: @@ -8527,7 +8527,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) - * + * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: @@ -8539,7 +8539,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) */ /*else*/ { @@ -8549,7 +8549,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") @@ -8562,11 +8562,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":217 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not C contiguous") - * + * */ __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); __pyx_t_1 = __pyx_t_2; @@ -8574,7 +8574,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") @@ -8585,7 +8585,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 218, __pyx_L1_error) @@ -8596,7 +8596,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 - * + * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") @@ -8605,7 +8605,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") @@ -8618,11 +8618,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":221 - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not Fortran contiguous") - * + * */ __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); __pyx_t_1 = __pyx_t_2; @@ -8630,7 +8630,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") @@ -8641,7 +8641,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< - * + * * info.buf = PyArray_DATA(self) */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 222, __pyx_L1_error) @@ -8652,7 +8652,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") @@ -8661,7 +8661,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":224 * raise ValueError(u"ndarray is not Fortran contiguous") - * + * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< * info.ndim = ndim * if copy_shape: @@ -8669,7 +8669,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":225 - * + * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< * if copy_shape: @@ -8780,7 +8780,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< * info.readonly = not PyArray_ISWRITEABLE(self) - * + * */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); @@ -8788,13 +8788,13 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< - * + * * cdef int t */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":242 - * + * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< * cdef dtype descr = self.descr @@ -8807,7 +8807,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< * cdef int offset - * + * */ __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); __Pyx_INCREF(__pyx_t_3); @@ -8816,16 +8816,16 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":246 * cdef int offset - * + * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< - * + * * if not hasfields and not copy_shape: */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) - * + * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None @@ -8856,7 +8856,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) - * + * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None @@ -8868,7 +8868,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< - * + * * if not hasfields: */ /*else*/ { @@ -8882,7 +8882,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self - * + * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or @@ -8891,7 +8891,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P if (__pyx_t_1) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":256 - * + * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< * if ((descr.byteorder == c'>' and little_endian) or @@ -9204,7 +9204,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self - * + * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or @@ -9253,7 +9253,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): */ (__pyx_v_f[0]) = '\x00'; @@ -9293,7 +9293,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, P /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) @@ -9316,7 +9316,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s __Pyx_RefNannySetupContext("__releasebuffer__", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) @@ -9335,7 +9335,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s free(__pyx_v_info->format); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":291 - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) @@ -9358,7 +9358,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< * # info.shape was stored after info.strides in the same block - * + * */ free(__pyx_v_info->strides); @@ -9373,7 +9373,7 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string - * + * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) @@ -9385,10 +9385,10 @@ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_s /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t - * + * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { @@ -9398,10 +9398,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":771 - * + * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); @@ -9413,10 +9413,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t - * + * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) - * + * */ /* function exit code */ @@ -9432,10 +9432,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) - * + * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { @@ -9445,10 +9445,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":774 - * + * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); @@ -9460,10 +9460,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) - * + * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) - * + * */ /* function exit code */ @@ -9479,10 +9479,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { @@ -9492,10 +9492,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":777 - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); @@ -9507,10 +9507,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) - * + * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) - * + * */ /* function exit code */ @@ -9526,10 +9526,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { @@ -9539,10 +9539,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":780 - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); @@ -9554,10 +9554,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) - * + * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) - * + * */ /* function exit code */ @@ -9573,10 +9573,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { @@ -9586,10 +9586,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":783 - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< - * + * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); @@ -9601,10 +9601,10 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) - * + * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * */ /* function exit code */ @@ -9620,7 +9620,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__ /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. @@ -9648,7 +9648,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __Pyx_RefNannySetupContext("_util_dtypestring", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":790 - * + * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) @@ -9661,13 +9661,13 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * cdef tuple fields - * + * */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields - * + * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields @@ -9689,11 +9689,11 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_t_3 = 0; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":795 - * + * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< * child, new_offset = fields - * + * */ if (unlikely(__pyx_v_descr->fields == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); @@ -9709,7 +9709,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< - * + * * if (end - f) - (new_offset - offset[0]) < 15: */ if (likely(__pyx_v_fields != Py_None)) { @@ -9725,8 +9725,8 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __PYX_ERR(1, 796, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else @@ -9746,10 +9746,10 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields - * + * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * */ __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 798, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); @@ -9762,10 +9762,10 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx if (__pyx_t_6) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 - * + * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * + * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 799, __pyx_L1_error) @@ -9776,16 +9776,16 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields - * + * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * */ } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") @@ -9804,7 +9804,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx __pyx_L8_next_or:; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":802 - * + * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") @@ -9822,7 +9822,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") @@ -9844,7 +9844,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * + * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") @@ -9852,7 +9852,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":813 - * + * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< * f[0] = 120 # "x"; pad byte @@ -9881,7 +9881,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< * offset[0] += 1 - * + * */ __pyx_v_f = (__pyx_v_f + 1); @@ -9889,7 +9889,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< - * + * * offset[0] += child.itemsize */ __pyx_t_8 = 0; @@ -9898,9 +9898,9 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":818 * offset[0] += 1 - * + * * offset[0] += child.itemsize # <<<<<<<<<<<<<< - * + * * if not PyDataType_HASFIELDS(child): */ __pyx_t_8 = 0; @@ -9908,7 +9908,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize - * + * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: @@ -9917,7 +9917,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx if (__pyx_t_6) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":821 - * + * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: @@ -9933,7 +9933,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") - * + * */ __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (__pyx_t_6) { @@ -9942,7 +9942,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * + * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 823, __pyx_L1_error) @@ -9956,12 +9956,12 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") - * + * */ } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":826 - * + * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" @@ -10307,7 +10307,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize - * + * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: @@ -10320,7 +10320,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< * return f - * + * */ /*else*/ { __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) __PYX_ERR(1, 849, __pyx_L1_error) @@ -10330,7 +10330,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields - * + * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields @@ -10342,15 +10342,15 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< - * - * + * + * */ __pyx_r = __pyx_v_f; goto __pyx_L0; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) - * + * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. @@ -10374,8 +10374,8 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx } /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 - * - * + * + * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: @@ -10444,7 +10444,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< * arr.base = baseptr - * + * */ Py_XDECREF(__pyx_v_arr->base); @@ -10452,14 +10452,14 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< - * + * * cdef inline object get_array_base(ndarray arr): */ __pyx_v_arr->base = __pyx_v_baseptr; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":966 - * - * + * + * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: @@ -10471,7 +10471,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr - * + * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None @@ -10484,7 +10484,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __Pyx_RefNannySetupContext("get_array_base", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 - * + * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None @@ -10506,7 +10506,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py goto __pyx_L0; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":977 - * + * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None @@ -10518,8 +10518,8 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py * return None * else: * return arr.base # <<<<<<<<<<<<<< - * - * + * + * */ /*else*/ { __Pyx_XDECREF(__pyx_r); @@ -10530,7 +10530,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr - * + * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None @@ -10609,7 +10609,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { * _import_array() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.multiarray failed to import") - * + * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { @@ -10623,7 +10623,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_umath() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 989, __pyx_L5_except_error) @@ -10676,7 +10676,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":991 * raise ImportError("numpy.core.multiarray failed to import") - * + * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10696,7 +10696,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_RefNannySetupContext("import_umath", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 - * + * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10721,7 +10721,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 993, __pyx_L3_error) /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 - * + * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10740,7 +10740,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") - * + * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { @@ -10754,7 +10754,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_ufunc() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 995, __pyx_L5_except_error) @@ -10767,7 +10767,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L5_except_error:; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":992 - * + * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10784,7 +10784,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":991 * raise ImportError("numpy.core.multiarray failed to import") - * + * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10807,7 +10807,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") - * + * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10827,7 +10827,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_RefNannySetupContext("import_ufunc", 0); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 - * + * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10852,7 +10852,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 999, __pyx_L3_error) /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 - * + * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10895,7 +10895,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __pyx_L5_except_error:; /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":998 - * + * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() @@ -10912,7 +10912,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") - * + * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() @@ -10987,7 +10987,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_fblas, __pyx_k_fblas, sizeof(__pyx_k_fblas), 0, 0, 1, 1}, {&__pyx_n_s_float32, __pyx_k_float32, sizeof(__pyx_k_float32), 0, 0, 1, 1}, {&__pyx_n_s_gensim_models_word2vec_inner, __pyx_k_gensim_models_word2vec_inner, sizeof(__pyx_k_gensim_models_word2vec_inner), 0, 0, 1, 1}, - {&__pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_k_home_ivan_release_gensim_gensim, sizeof(__pyx_k_home_ivan_release_gensim_gensim), 0, 0, 1, 0}, + {&__pyx_kp_s_gensim_models_word2vec_inner_pyx, __pyx_k_gensim_models_word2vec_inner_pyx, sizeof(__pyx_k_gensim_models_word2vec_inner_pyx), 0, 0, 1, 0}, {&__pyx_n_s_hs, __pyx_k_hs, sizeof(__pyx_k_hs), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_idx_end, __pyx_k_idx_end, sizeof(__pyx_k_idx_end), 0, 0, 1, 1}, @@ -11082,7 +11082,7 @@ static int __Pyx_InitCachedConstants(void) { * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_tuple_ = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 340, __pyx_L1_error) @@ -11096,7 +11096,7 @@ static int __Pyx_InitCachedConstants(void) { * cum_table_len = len(model.cum_table) * if negative or sample: * next_random = (2**24) * model.random.randint(0, 2**24) + model.random.randint(0, 2**24) # <<<<<<<<<<<<<< - * + * * # convert Python structures to primitive types, so we can release the GIL */ __pyx_tuple__3 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_16777216); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 448, __pyx_L1_error) @@ -11110,7 +11110,7 @@ static int __Pyx_InitCachedConstants(void) { * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< - * + * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 218, __pyx_L1_error) @@ -11121,7 +11121,7 @@ static int __Pyx_InitCachedConstants(void) { * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< - * + * * info.buf = PyArray_DATA(self) */ __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 222, __pyx_L1_error) @@ -11140,10 +11140,10 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GIVEREF(__pyx_tuple__7); /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":799 - * + * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * + * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 799, __pyx_L1_error) @@ -11165,7 +11165,7 @@ static int __Pyx_InitCachedConstants(void) { * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * + * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 823, __pyx_L1_error) @@ -11176,7 +11176,7 @@ static int __Pyx_InitCachedConstants(void) { * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_umath() except -1: */ __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 989, __pyx_L1_error) @@ -11187,7 +11187,7 @@ static int __Pyx_InitCachedConstants(void) { * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< - * + * * cdef inline int import_ufunc() except -1: */ __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 995, __pyx_L1_error) @@ -11204,8 +11204,8 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GIVEREF(__pyx_tuple__13); /* "gensim/models/word2vec_inner.pyx":296 - * - * + * + * * def train_batch_sg(model, sentences, alpha, _work, compute_loss): # <<<<<<<<<<<<<< * cdef int hs = model.hs * cdef int negative = model.negative @@ -11213,11 +11213,11 @@ static int __Pyx_InitCachedConstants(void) { __pyx_tuple__15 = PyTuple_Pack(40, __pyx_n_s_model, __pyx_n_s_sentences, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_compute_loss, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_compute_loss_2, __pyx_n_s_running_training_loss_2, __pyx_n_s_syn0, __pyx_n_s_word_locks, __pyx_n_s_work_2, __pyx_n_s_alpha_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_reduced_windows, __pyx_n_s_sentence_idx, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_effective_words, __pyx_n_s_effective_sentences, __pyx_n_s_sent_idx, __pyx_n_s_idx_start, __pyx_n_s_idx_end, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_syn1neg, __pyx_n_s_cum_table, __pyx_n_s_cum_table_len, __pyx_n_s_next_random, __pyx_n_s_vlookup, __pyx_n_s_sent, __pyx_n_s_token, __pyx_n_s_word, __pyx_n_s_item); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 296, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__15); __Pyx_GIVEREF(__pyx_tuple__15); - __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(5, 0, 40, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_train_batch_sg, 296, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 296, __pyx_L1_error) + __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(5, 0, 40, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_word2vec_inner_pyx, __pyx_n_s_train_batch_sg, 296, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 296, __pyx_L1_error) /* "gensim/models/word2vec_inner.pyx":403 - * - * + * + * * def train_batch_cbow(model, sentences, alpha, _work, _neu1, compute_loss): # <<<<<<<<<<<<<< * cdef int hs = model.hs * cdef int negative = model.negative @@ -11225,35 +11225,35 @@ static int __Pyx_InitCachedConstants(void) { __pyx_tuple__17 = PyTuple_Pack(43, __pyx_n_s_model, __pyx_n_s_sentences, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_neu1, __pyx_n_s_compute_loss, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_cbow_mean, __pyx_n_s_compute_loss_2, __pyx_n_s_running_training_loss_2, __pyx_n_s_syn0, __pyx_n_s_word_locks, __pyx_n_s_work_2, __pyx_n_s_alpha_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_reduced_windows, __pyx_n_s_sentence_idx, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_effective_words, __pyx_n_s_effective_sentences, __pyx_n_s_sent_idx, __pyx_n_s_idx_start, __pyx_n_s_idx_end, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_syn1neg, __pyx_n_s_cum_table, __pyx_n_s_cum_table_len, __pyx_n_s_next_random, __pyx_n_s_neu1_2, __pyx_n_s_vlookup, __pyx_n_s_sent, __pyx_n_s_token, __pyx_n_s_word, __pyx_n_s_item); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 403, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__17); __Pyx_GIVEREF(__pyx_tuple__17); - __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(6, 0, 43, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_train_batch_cbow, 403, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) __PYX_ERR(0, 403, __pyx_L1_error) + __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(6, 0, 43, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_word2vec_inner_pyx, __pyx_n_s_train_batch_cbow, 403, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) __PYX_ERR(0, 403, __pyx_L1_error) /* "gensim/models/word2vec_inner.pyx":510 - * + * * # Score is only implemented for hierarchical softmax * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) */ __pyx_tuple__19 = PyTuple_Pack(20, __pyx_n_s_model, __pyx_n_s_sentence, __pyx_n_s_work, __pyx_n_s_syn0, __pyx_n_s_work_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_sentence_len, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_result, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_vlookup, __pyx_n_s_token, __pyx_n_s_word); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(0, 510, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__19); __Pyx_GIVEREF(__pyx_tuple__19); - __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(3, 0, 20, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_score_sentence_sg, 510, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(0, 510, __pyx_L1_error) + __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(3, 0, 20, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_word2vec_inner_pyx, __pyx_n_s_score_sentence_sg, 510, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(0, 510, __pyx_L1_error) /* "gensim/models/word2vec_inner.pyx":588 * work[0] += f - * + * * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< - * + * * cdef int cbow_mean = model.cbow_mean */ __pyx_tuple__21 = PyTuple_Pack(23, __pyx_n_s_model, __pyx_n_s_sentence, __pyx_n_s_work, __pyx_n_s_neu1, __pyx_n_s_cbow_mean, __pyx_n_s_syn0, __pyx_n_s_work_2, __pyx_n_s_neu1_2, __pyx_n_s_size, __pyx_n_s_codelens, __pyx_n_s_indexes, __pyx_n_s_sentence_len, __pyx_n_s_window, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_result, __pyx_n_s_syn1, __pyx_n_s_points, __pyx_n_s_codes, __pyx_n_s_vlookup, __pyx_n_s_token, __pyx_n_s_word); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 588, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__21); __Pyx_GIVEREF(__pyx_tuple__21); - __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(4, 0, 23, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_score_sentence_cbow, 588, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 588, __pyx_L1_error) + __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(4, 0, 23, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_word2vec_inner_pyx, __pyx_n_s_score_sentence_cbow, 588, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 588, __pyx_L1_error) /* "gensim/models/word2vec_inner.pyx":683 - * - * + * + * * def init(): # <<<<<<<<<<<<<< * """ * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized @@ -11261,7 +11261,7 @@ static int __Pyx_InitCachedConstants(void) { __pyx_tuple__23 = PyTuple_Pack(7, __pyx_n_s_i, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_expected, __pyx_n_s_size, __pyx_n_s_d_res, __pyx_n_s_p_res); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 683, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__23); __Pyx_GIVEREF(__pyx_tuple__23); - __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(0, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ivan_release_gensim_gensim, __pyx_n_s_init, 683, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 683, __pyx_L1_error) + __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(0, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_gensim_models_word2vec_inner_pyx, __pyx_n_s_init, 683, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 683, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -11389,7 +11389,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) if (__Pyx_ExportFunction("random_int32", (void (*)(void))__pyx_f_6gensim_6models_14word2vec_inner_random_int32, "unsigned PY_LONG_LONG (unsigned PY_LONG_LONG *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Type init code ---*/ /*--- Type import code ---*/ - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", #if CYTHON_COMPILING_IN_PYPY sizeof(PyTypeObject), #else @@ -11409,11 +11409,11 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) #endif /* "gensim/models/word2vec_inner.pyx":11 - * + * * import cython * import numpy as np # <<<<<<<<<<<<<< * cimport numpy as np - * + * */ __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); @@ -11421,7 +11421,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":19 - * + * * # scipy <= 0.15 * try: # <<<<<<<<<<<<<< * from scipy.linalg.blas import fblas @@ -11458,7 +11458,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; /* "gensim/models/word2vec_inner.pyx":19 - * + * * # scipy <= 0.15 * try: # <<<<<<<<<<<<<< * from scipy.linalg.blas import fblas @@ -11493,7 +11493,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) * except ImportError: * # in scipy > 0.15, fblas function has been removed * import scipy.linalg.blas as fblas # <<<<<<<<<<<<<< - * + * * REAL = np.float32 */ __pyx_t_8 = PyList_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 23, __pyx_L4_except_error) @@ -11515,7 +11515,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __pyx_L4_except_error:; /* "gensim/models/word2vec_inner.pyx":19 - * + * * # scipy <= 0.15 * try: # <<<<<<<<<<<<<< * from scipy.linalg.blas import fblas @@ -11538,9 +11538,9 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) /* "gensim/models/word2vec_inner.pyx":25 * import scipy.linalg.blas as fblas - * + * * REAL = np.float32 # <<<<<<<<<<<<<< - * + * * DEF MAX_SENTENCE_LEN = 10000 */ __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 25, __pyx_L1_error) @@ -11553,7 +11553,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) /* "gensim/models/word2vec_inner.pyx":29 * DEF MAX_SENTENCE_LEN = 10000 - * + * * cdef scopy_ptr scopy=PyCObject_AsVoidPtr(fblas.scopy._cpointer) # y = x # <<<<<<<<<<<<<< * cdef saxpy_ptr saxpy=PyCObject_AsVoidPtr(fblas.saxpy._cpointer) # y += alpha * x * cdef sdot_ptr sdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # float = dot(x, y) @@ -11570,7 +11570,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":30 - * + * * cdef scopy_ptr scopy=PyCObject_AsVoidPtr(fblas.scopy._cpointer) # y = x * cdef saxpy_ptr saxpy=PyCObject_AsVoidPtr(fblas.saxpy._cpointer) # y += alpha * x # <<<<<<<<<<<<<< * cdef sdot_ptr sdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # float = dot(x, y) @@ -11628,7 +11628,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) * cdef dsdot_ptr dsdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # double = dot(x, y) * cdef snrm2_ptr snrm2=PyCObject_AsVoidPtr(fblas.snrm2._cpointer) # sqrt(x^2) # <<<<<<<<<<<<<< * cdef sscal_ptr sscal=PyCObject_AsVoidPtr(fblas.sscal._cpointer) # x = alpha * x - * + * */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); @@ -11645,7 +11645,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) * cdef dsdot_ptr dsdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # double = dot(x, y) * cdef snrm2_ptr snrm2=PyCObject_AsVoidPtr(fblas.snrm2._cpointer) # sqrt(x^2) * cdef sscal_ptr sscal=PyCObject_AsVoidPtr(fblas.sscal._cpointer) # x = alpha * x # <<<<<<<<<<<<<< - * + * * DEF EXP_TABLE_SIZE = 1000 */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) @@ -11661,25 +11661,25 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) /* "gensim/models/word2vec_inner.pyx":42 * cdef REAL_t[EXP_TABLE_SIZE] LOG_TABLE - * + * * cdef int ONE = 1 # <<<<<<<<<<<<<< * cdef REAL_t ONEF = 1.0 - * + * */ __pyx_v_6gensim_6models_14word2vec_inner_ONE = 1; /* "gensim/models/word2vec_inner.pyx":43 - * + * * cdef int ONE = 1 * cdef REAL_t ONEF = 1.0 # <<<<<<<<<<<<<< - * + * * # for when fblas.sdot returns a double */ __pyx_v_6gensim_6models_14word2vec_inner_ONEF = ((__pyx_t_6gensim_6models_14word2vec_inner_REAL_t)1.0); /* "gensim/models/word2vec_inner.pyx":296 - * - * + * + * * def train_batch_sg(model, sentences, alpha, _work, compute_loss): # <<<<<<<<<<<<<< * cdef int hs = model.hs * cdef int negative = model.negative @@ -11690,8 +11690,8 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":403 - * - * + * + * * def train_batch_cbow(model, sentences, alpha, _work, _neu1, compute_loss): # <<<<<<<<<<<<<< * cdef int hs = model.hs * cdef int negative = model.negative @@ -11702,10 +11702,10 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":510 - * + * * # Score is only implemented for hierarchical softmax * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< - * + * * cdef REAL_t *syn0 = (np.PyArray_DATA(model.wv.syn0)) */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_14word2vec_inner_5score_sentence_sg, NULL, __pyx_n_s_gensim_models_word2vec_inner); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 510, __pyx_L1_error) @@ -11715,9 +11715,9 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) /* "gensim/models/word2vec_inner.pyx":588 * work[0] += f - * + * * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< - * + * * cdef int cbow_mean = model.cbow_mean */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_14word2vec_inner_7score_sentence_cbow, NULL, __pyx_n_s_gensim_models_word2vec_inner); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 588, __pyx_L1_error) @@ -11726,8 +11726,8 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":683 - * - * + * + * * def init(): # <<<<<<<<<<<<<< * """ * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized @@ -11739,7 +11739,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) /* "gensim/models/word2vec_inner.pyx":724 * return 2 - * + * * FAST_VERSION = init() # initialize the module # <<<<<<<<<<<<<< * MAX_WORDS_IN_BATCH = MAX_SENTENCE_LEN */ @@ -11767,7 +11767,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "gensim/models/word2vec_inner.pyx":725 - * + * * FAST_VERSION = init() # initialize the module * MAX_WORDS_IN_BATCH = MAX_SENTENCE_LEN # <<<<<<<<<<<<<< */ @@ -11785,7 +11785,7 @@ PyMODINIT_FUNC PyInit_word2vec_inner(void) /* "../../../../usr/lib/python2.7/dist-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") - * + * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() diff --git a/gensim/models/wrappers/dtmmodel.py b/gensim/models/wrappers/dtmmodel.py index 8bbadfc663..63110c5b00 100644 --- a/gensim/models/wrappers/dtmmodel.py +++ b/gensim/models/wrappers/dtmmodel.py @@ -291,10 +291,7 @@ def show_topic(self, topicid, time, topn=50, num_words=None): """ if num_words is not None: # deprecated num_words is used - logger.warning( - "The parameter num_words for show_topic() would be deprecated in the updated version. " - "Please use topn instead." - ) + warnings.warn("The parameter `num_words` is deprecated, will be removed in 4.0.0, use `topn` instead.") topn = num_words topics = self.lambda_[:, :, time] @@ -311,10 +308,7 @@ def show_topic(self, topicid, time, topn=50, num_words=None): def print_topic(self, topicid, time, topn=10, num_words=None): """Return the given topic, formatted as a string.""" if num_words is not None: # deprecated num_words is used - warnings.warn( - "The parameter num_words for print_topic() would be deprecated in the updated version. " - "Please use topn instead." - ) + warnings.warn("The parameter `num_words` is deprecated, will be removed in 4.0.0, use `topn` instead.") topn = num_words return ' + '.join(['%.3f*%s' % v for v in self.show_topic(topicid, time, topn)]) diff --git a/gensim/models/wrappers/fasttext.py b/gensim/models/wrappers/fasttext.py index 29927b7051..8e7a966cee 100644 --- a/gensim/models/wrappers/fasttext.py +++ b/gensim/models/wrappers/fasttext.py @@ -7,6 +7,13 @@ """ +Warnings +-------- +.. deprecated:: 3.2.0 + Use :class:`gensim.models.fasttext.FastText` instead of :class:`gensim.models.wrappers.fasttext.FastText`. + + + Python wrapper around word representation learning from FastText, a library for efficient learning of word representations and sentence classification [1]. @@ -24,6 +31,8 @@ .. [1] https://github.com/facebookresearch/fastText#enriching-word-vectors-with-subword-information + + """ @@ -137,6 +146,11 @@ def __contains__(self, word): char_ngrams = compute_ngrams(word, self.min_n, self.max_n) return any(ng in self.ngrams for ng in char_ngrams) + @classmethod + def load_word2vec_format(cls, *args, **kwargs): + """Not suppported. Use gensim.models.KeyedVectors.load_word2vec_format instead.""" + raise NotImplementedError("Not supported. Use gensim.models.KeyedVectors.load_word2vec_format instead.") + class FastText(Word2Vec): """ @@ -147,6 +161,12 @@ class FastText(Word2Vec): improving speed and scope of functionality like `most_similar`, `similarity` by extracting vectors into numpy matrix. + Warnings + -------- + .. deprecated:: 3.2.0 + Use :class:`gensim.models.fasttext.FastText` instead of :class:`gensim.models.wrappers.fasttext.FastText`. + + """ def initialize_word_vectors(self): diff --git a/gensim/models/wrappers/ldamallet.py b/gensim/models/wrappers/ldamallet.py index 7f39e12c5a..83800f0b9c 100644 --- a/gensim/models/wrappers/ldamallet.py +++ b/gensim/models/wrappers/ldamallet.py @@ -33,6 +33,7 @@ import logging import os import random +import warnings import tempfile import xml.etree.ElementTree as et import zipfile @@ -258,7 +259,7 @@ def show_topics(self, num_topics=10, num_words=10, log=False, formatted=True): if formatted: topic = self.print_topic(i, topn=num_words) else: - topic = self.show_topic(i, num_words=num_words) + topic = self.show_topic(i, topn=num_words) shown.append((i, topic)) if log: logger.info("topic #%i (%.3f): %s", i, self.alpha[i], topic) @@ -266,8 +267,7 @@ def show_topics(self, num_topics=10, num_words=10, log=False, formatted=True): def show_topic(self, topicid, topn=10, num_words=None): if num_words is not None: # deprecated num_words is used - logger.warning("The parameter num_words for show_topic() would be deprecated in the updated version.") - logger.warning("Please use topn instead.") + warnings.warn("The parameter `num_words` is deprecated, will be removed in 4.0.0, use `topn` instead.") topn = num_words if self.word_topics is None: diff --git a/gensim/parsing/preprocessing.py b/gensim/parsing/preprocessing.py index f0cf22a6e8..cc15b4665b 100644 --- a/gensim/parsing/preprocessing.py +++ b/gensim/parsing/preprocessing.py @@ -363,7 +363,7 @@ def preprocess_documents(docs): Returns ------- - list of (list of str) + list of list of str Processed documents split by whitespace. Examples diff --git a/gensim/scripts/segment_wiki.py b/gensim/scripts/segment_wiki.py index 2e0137feb6..b43d9d4a30 100755 --- a/gensim/scripts/segment_wiki.py +++ b/gensim/scripts/segment_wiki.py @@ -109,7 +109,7 @@ def segment_and_write_all_articles(file_path, output_file, min_article_character """ if output_file is None: - outfile = sys.stdout + outfile = getattr(sys.stdout, 'buffer', sys.stdout) # we want write bytes, so for py3 we used 'buffer' else: outfile = smart_open(output_file, 'wb') @@ -122,9 +122,10 @@ def segment_and_write_all_articles(file_path, output_file, min_article_character output_data["section_texts"].append(section_content) if (idx + 1) % 100000 == 0: logger.info("processed #%d articles (at %r now)", idx + 1, article_title) - outfile.write(json.dumps(output_data) + "\n") + outfile.write((json.dumps(output_data) + "\n").encode('utf-8')) finally: - outfile.close() + if output_file is not None: + outfile.close() def extract_page_xmls(f): diff --git a/gensim/summarization/__init__.py b/gensim/summarization/__init__.py index 6bca1f109a..2d1d959a29 100644 --- a/gensim/summarization/__init__.py +++ b/gensim/summarization/__init__.py @@ -2,3 +2,4 @@ # bring model classes directly into package namespace, to save some typing from .summarizer import summarize, summarize_corpus # noqa:F401 from .keywords import keywords # noqa:F401 +from .mz_entropy import mz_keywords # noqa:F401 diff --git a/gensim/summarization/bm25.py b/gensim/summarization/bm25.py index bd4d70911a..ec484949cf 100644 --- a/gensim/summarization/bm25.py +++ b/gensim/summarization/bm25.py @@ -3,20 +3,75 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module contains function of computing rank scores for documents in +corpus and helper class `BM25` used in calculations. Original alhorithm +descibed in [1]_, also you may check Wikipedia page [2]_. + + +.. [1] Robertson, Stephen; Zaragoza, Hugo (2009). The Probabilistic Relevance Framework: BM25 and Beyond, + http://www.staff.city.ac.uk/~sb317/papers/foundations_bm25_review.pdf +.. [2] Okapi BM25 on Wikipedia, https://en.wikipedia.org/wiki/Okapi_BM25 + + + +Examples +-------- +>>> from gensim.summarization.bm25 import get_bm25_weights +>>> corpus = [ +... ["black", "cat", "white", "cat"], +... ["cat", "outer", "space"], +... ["wag", "dog"] +... ] +>>> result = get_bm25_weights(corpus) + + +Data: +----- +.. data:: PARAM_K1 - Free smoothing parameter for BM25. +.. data:: PARAM_B - Free smoothing parameter for BM25. +.. data:: EPSILON - Constant used for negative idf of document in corpus. + +""" + + import math from six import iteritems from six.moves import xrange -# BM25 parameters. PARAM_K1 = 1.5 PARAM_B = 0.75 EPSILON = 0.25 class BM25(object): + """Implementation of Best Matching 25 ranking function. + + Attributes + ---------- + corpus_size : int + Size of corpus (number of documents). + avgdl : float + Average length of document in `corpus`. + corpus : list of list of str + Corpus of documents. + f : list of dicts of int + Dictionary with terms frequencies for each document in `corpus`. Words used as keys and frequencies as values. + df : dict + Dictionary with terms frequencies for whole `corpus`. Words used as keys and frequencies as values. + idf : dict + Dictionary with inversed terms frequencies for whole `corpus`. Words used as keys and frequencies as values. + + """ def __init__(self, corpus): + """ + Parameters + ---------- + corpus : list of list of str + Given corpus. + + """ self.corpus_size = len(corpus) self.avgdl = sum(float(len(x)) for x in corpus) / self.corpus_size self.corpus = corpus @@ -26,6 +81,7 @@ def __init__(self, corpus): self.initialize() def initialize(self): + """Calculates frequencies of terms in documents and in corpus. Also computes inverse document frequencies.""" for document in self.corpus: frequencies = {} for word in document: @@ -43,6 +99,23 @@ def initialize(self): self.idf[word] = math.log(self.corpus_size - freq + 0.5) - math.log(freq + 0.5) def get_score(self, document, index, average_idf): + """Computes BM25 score of given `document` in relation to item of corpus selected by `index`. + + Parameters + ---------- + document : list of str + Document to be scored. + index : int + Index of document in corpus selected to score with `document`. + average_idf : float + Average idf in corpus. + + Returns + ------- + float + BM25 score. + + """ score = 0 for word in document: if word not in self.f[index]: @@ -53,6 +126,22 @@ def get_score(self, document, index, average_idf): return score def get_scores(self, document, average_idf): + """Computes and returns BM25 scores of given `document` in relation to + every item in corpus. + + Parameters + ---------- + document : list of str + Document to be scored. + average_idf : float + Average idf in corpus. + + Returns + ------- + list of float + BM25 scores. + + """ scores = [] for index in xrange(self.corpus_size): score = self.get_score(document, index, average_idf) @@ -61,6 +150,30 @@ def get_scores(self, document, average_idf): def get_bm25_weights(corpus): + """Returns BM25 scores (weights) of documents in corpus. + Each document has to be weighted with every document in given corpus. + + Parameters + ---------- + corpus : list of list of str + Corpus of documents. + + Returns + ------- + list of list of float + BM25 scores. + + Examples + -------- + >>> from gensim.summarization.bm25 import get_bm25_weights + >>> corpus = [ + ... ["black", "cat", "white", "cat"], + ... ["cat", "outer", "space"], + ... ["wag", "dog"] + ... ] + >>> result = get_bm25_weights(corpus) + + """ bm25 = BM25(corpus) average_idf = sum(float(val) for val in bm25.idf.values()) / len(bm25.idf) diff --git a/gensim/summarization/commons.py b/gensim/summarization/commons.py index 1c467098f9..f1a2264e46 100644 --- a/gensim/summarization/commons.py +++ b/gensim/summarization/commons.py @@ -3,10 +3,45 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module provides functions of creating graph from sequence of values and removing of unreachable nodes. + + +Examples +-------- + +Create simple graph and add edges. Let's take a look at nodes. + +>>> gg = build_graph(['Felidae', 'Lion', 'Tiger', 'Wolf']) +>>> gg.add_edge(("Felidae", "Lion")) +>>> gg.add_edge(("Felidae", "Tiger")) +>>> sorted(gg.nodes()) +['Felidae', 'Lion', 'Tiger', 'Wolf'] + +Remove nodes with no edges. + +>>> remove_unreachable_nodes(gg) +>>> sorted(gg.nodes()) +['Felidae', 'Lion', 'Tiger'] + +""" + from gensim.summarization.graph import Graph def build_graph(sequence): + """Creates and returns undirected graph with given sequence of values. + + Parameters + ---------- + sequence : list of hashable + Sequence of values. + + Returns + ------- + :class:`~gensim.summarization.graph.Graph` + Created graph. + + """ graph = Graph() for item in sequence: if not graph.has_node(item): @@ -15,6 +50,15 @@ def build_graph(sequence): def remove_unreachable_nodes(graph): + """Removes unreachable nodes (nodes with no edges), inplace. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + + """ + for node in graph.nodes(): if sum(graph.edge_weight((node, other)) for other in graph.neighbors(node)) == 0: graph.del_node(node) diff --git a/gensim/summarization/graph.py b/gensim/summarization/graph.py index c35a59a25d..79cd1a160f 100644 --- a/gensim/summarization/graph.py +++ b/gensim/summarization/graph.py @@ -3,141 +3,203 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module contains abstract class IGraph represents graphs interface and +class Graph (based on IGraph) which implements undirected graph. + +Examples +-------- + +Create simple graph with 4 nodes. + +>>> g = Graph() +>>> g.add_node('Felidae') +>>> g.add_node('Lion') +>>> g.add_node('Tiger') +>>> g.add_node('Wolf') +>>> sorted(g.nodes()) +['Felidae', 'Lion', 'Tiger', 'Wolf'] + +Add some edges and check neighbours. + +>>> g.add_edge(("Felidae", "Lion")) +>>> g.add_edge(("Felidae", "Tiger")) +>>> g.neighbors("Felidae") +['Lion', 'Tiger'] + +One node has no neighbours. + +>>> g.neighbors("Wolf") +[] + +""" + from abc import ABCMeta, abstractmethod class IGraph(object): - """ Represents the interface or contract that the graph for TextRank + """Represents the interface or contract that the graph for TextRank should implement. """ __metaclass__ = ABCMeta @abstractmethod def nodes(self): - """ - Return node list. + """Returns all nodes of graph. + + Returns + ------- + list of hashable + Nodes of graph. - @rtype: list - @return: Node list. """ pass @abstractmethod def edges(self): - """ - Return all edges in the graph. + """Returns all edges of graph. + + Returns + ------- + list of (hashable, hashable) + Edges of graph. - @rtype: list - @return: List of all edges in the graph. """ pass @abstractmethod def neighbors(self, node): - """ - Return all nodes that are directly accessible from given node. + """Return all nodes that are directly accessible from given node. + + Parameters + ---------- + node : hashable + Given node identifier. - @type node: node - @param node: Node identifier + Returns + ------- + list of hashable + Nodes directly accessible from given `node`. - @rtype: list - @return: List of nodes directly accessible from given node. """ pass @abstractmethod def has_node(self, node): - """ - Return whether the requested node exists. + """Returns whether the requested node exists. + + Parameters + ---------- + node : hashable + Given node identifier. - @type node: node - @param node: Node identifier + Returns + ------- + bool + True if `node` exists, False otherwise. - @rtype: boolean - @return: Truth-value for node existence. """ pass @abstractmethod def add_node(self, node, attrs=None): - """ - Add given node to the graph. + """Adds given node to the graph. - @attention: While nodes can be of any type, it's strongly recommended - to use only numbers and single-line strings as node identifiers if you - intend to use write(). + Note + ---- + While nodes can be of any type, it's strongly recommended to use only numbers and single-line strings + as node identifiers if you intend to use write(). - @type node: node - @param node: Node identifier. + Parameters + ---------- + node : hashable + Given node + attrs : list, optional + Node attributes specified as (attribute, value) - @type attrs: list - @param attrs: List of node attributes specified as (attribute, value) - tuples. """ pass @abstractmethod def add_edge(self, edge, wt=1, label='', attrs=None): - """ - Add an edge to the graph connecting two nodes. - - An edge, here, is a pair of nodes like C{(n, m)}. - - @type edge: tuple - @param edge: Edge. - - @type wt: number - @param wt: Edge weight. + """Adds an edge to the graph connecting two nodes. An edge, here, + is a tuple of two nodes. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + wt : float, optional + Weight of new edge. + label : str, optional + Edge label. + attrs : list, optional + Node attributes specified as (attribute, value) - @type label: string - @param label: Edge label. - - @type attrs: list - @param attrs: List of node attributes specified as (attribute, value) - tuples. """ pass @abstractmethod def has_edge(self, edge): - """ - Return whether an edge exists. + """Returns whether an edge exists. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. - @type edge: tuple - @param edge: Edge. + Returns + ------- + bool + True if `edge` exists, False otherwise. - @rtype: boolean - @return: Truth-value for edge existence. """ pass @abstractmethod def edge_weight(self, edge): - """ - Get the weight of an edge. + """Returns weigth of given edge. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. - @type edge: edge - @param edge: One edge. + Returns + ------- + float + Edge weight. - @rtype: number - @return: Edge weight. """ pass @abstractmethod def del_node(self, node): - """ - Remove a node from the graph. + """Removes node and its edges from the graph. + + Parameters + ---------- + node : hashable + Node to delete. - @type node: node - @param node: Node identifier. """ pass class Graph(IGraph): """ - Implementation of an undirected graph, based on Pygraph + Implementation of an undirected graph, based on IGraph. + + Attributes + ---------- + Graph.WEIGHT_ATTRIBUTE_NAME : str + Name of weight attribute in graph. + Graph.DEFAULT_WEIGHT : float + Weight set by default. + Graph.LABEL_ATTRIBUTE_NAME : str + Default name of attribute. Not used. + Graph.DEFAULT_LABEL : str + Label set by default. Not used. + """ WEIGHT_ATTRIBUTE_NAME = "weight" @@ -147,6 +209,8 @@ class Graph(IGraph): DEFAULT_LABEL = "" def __init__(self): + """Initializes object.""" + # Metadata about edges # Mapping: Edge -> Dict mapping, lablel-> str, wt->num self.edge_properties = {} @@ -160,19 +224,90 @@ def __init__(self): self.node_neighbors = {} def has_edge(self, edge): + """Returns whether an edge exists. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + Returns + ------- + bool + True if `edge` exists, False otherwise. + + """ u, v = edge return (u, v) in self.edge_properties and (v, u) in self.edge_properties def edge_weight(self, edge): + """Returns weight of given edge. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + Returns + ------- + float + Edge weight. + + """ return self.get_edge_properties(edge).setdefault(self.WEIGHT_ATTRIBUTE_NAME, self.DEFAULT_WEIGHT) def neighbors(self, node): + """Returns all nodes that are directly accessible from given node. + + Parameters + ---------- + node : hashable + Given node identifier. + + Returns + ------- + list of hashable + Nodes directly accessible from given `node`. + + """ return self.node_neighbors[node] def has_node(self, node): + """Returns whether the requested node exists. + + Parameters + ---------- + node : hashable + Given node. + + Returns + ------- + bool + True if `node` exists, False otherwise. + + """ return node in self.node_neighbors def add_edge(self, edge, wt=1, label='', attrs=None): + """Adds an edge to the graph connecting two nodes. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + wt : float, optional + Weight of new edge. + label : str, optional + Edge label. + attrs : list, optional + Node attributes specified as (attribute, value). + + Raises + ------ + ValueError + If `edge` already exists in graph. + + """ if attrs is None: attrs = [] u, v = edge @@ -187,6 +322,27 @@ def add_edge(self, edge, wt=1, label='', attrs=None): raise ValueError("Edge (%s, %s) already in graph" % (u, v)) def add_node(self, node, attrs=None): + """Adds given node to the graph. + + Note + ---- + While nodes can be of any type, it's strongly recommended + to use only numbers and single-line strings as node identifiers if you + intend to use write(). + + Parameters + ---------- + node : hashable + Given node. + attrs : list of (hashable, hashable), optional + Node attributes specified as (attribute, value) + + Raises + ------ + ValueError + If `node` already exists in graph. + + """ if attrs is None: attrs = [] if node not in self.node_neighbors: @@ -196,44 +352,138 @@ def add_node(self, node, attrs=None): raise ValueError("Node %s already in graph" % node) def nodes(self): + """Returns all nodes of the graph. + + Returns + ------- + list of hashable + Nodes of graph. + + """ return list(self.node_neighbors.keys()) def edges(self): + """Returns all edges of the graph. + + Returns + ------- + list of (hashable, hashable) + Edges of graph. + + """ return [a for a in self.edge_properties.keys()] def del_node(self, node): + """Removes given node and its edges from the graph. + + Parameters + ---------- + node : hashable + Given node. + + """ for each in list(self.neighbors(node)): if each != node: self.del_edge((each, node)) del self.node_neighbors[node] del self.node_attr[node] - # Helper methods def get_edge_properties(self, edge): + """Returns properties of given given edge. If edge doesn't exist + empty dictionary will be returned. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + Returns + ------- + dict + Properties of graph. + + """ return self.edge_properties.setdefault(edge, {}) def add_edge_attributes(self, edge, attrs): + """Adds attributes `attrs` to given edge, order of nodes in edge doesn't matter. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + attrs : list + Provided attributes to add. + + """ for attr in attrs: self.add_edge_attribute(edge, attr) def add_edge_attribute(self, edge, attr): + """Adds attribute `attr` to given edge, order of nodes in edge doesn't matter. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + attr : object + Provided attribute to add. + + """ self.edge_attr[edge] = self.edge_attributes(edge) + [attr] if edge[0] != edge[1]: self.edge_attr[(edge[1], edge[0])] = self.edge_attributes((edge[1], edge[0])) + [attr] def edge_attributes(self, edge): + """Returns attributes of given edge. + + Note + ---- + In case of non existing edge returns empty list. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + Returns + ------- + list + Attributes of given edge. + + """ try: return self.edge_attr[edge] except KeyError: return [] def set_edge_properties(self, edge, **properties): + """Adds `properties` to given edge, order of nodes in edge doesn't matter. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + properties : dict + Properties to add. + + """ self.edge_properties.setdefault(edge, {}).update(properties) if edge[0] != edge[1]: self.edge_properties.setdefault((edge[1], edge[0]), {}).update(properties) def del_edge(self, edge): + """Removes given edges from the graph. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + """ u, v = edge self.node_neighbors[u].remove(v) self.del_edge_labeling((u, v)) @@ -242,6 +492,14 @@ def del_edge(self, edge): self.del_edge_labeling((v, u)) def del_edge_labeling(self, edge): + """Removes attributes and properties of given edge. + + Parameters + ---------- + edge : (hashable, hashable) + Given edge. + + """ keys = [edge, edge[::-1]] for key in keys: diff --git a/gensim/summarization/keywords.py b/gensim/summarization/keywords.py index 1630c9389d..4074088a04 100644 --- a/gensim/summarization/keywords.py +++ b/gensim/summarization/keywords.py @@ -3,6 +3,35 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module contains functions to find keywords of the text and building graph on tokens from text. + +Examples +-------- +Extract keywords from text + +>>> from gensim.summarization import keywords +>>> text='''Challenges in natural language processing frequently involve +... speech recognition, natural language understanding, natural language +... generation (frequently from formal, machine-readable logical forms), +... connecting language and machine perception, dialog systems, or some +... combination thereof.''' +>>> keywords(text).split('\\n') +[u'natural language', u'machine', u'frequently'] + + +Notes +----- +Check tags in http://www.clips.ua.ac.be/pages/mbsp-tags and use only first two letters +for `INCLUDING_FILTER` and `EXCLUDING_FILTER` + +Data: +----- +.. data:: WINDOW_SIZE - Size of window, number of consecutive tokens in processing. +.. data:: INCLUDING_FILTER - Including part of speech filters. +.. data:: EXCLUDING_FILTER - Excluding part of speech filters. + +""" + from gensim.summarization.pagerank_weighted import pagerank_weighted as _pagerank from gensim.summarization.textcleaner import clean_text_by_word as _clean_text_by_word from gensim.summarization.textcleaner import tokenize_by_word as _tokenize_by_word @@ -17,20 +46,43 @@ WINDOW_SIZE = 2 -""" -Check tags in http://www.clips.ua.ac.be/pages/mbsp-tags and use only first two letters -Example: filter for nouns and adjectives: -INCLUDING_FILTER = ['NN', 'JJ'] -""" INCLUDING_FILTER = ['NN', 'JJ'] EXCLUDING_FILTER = [] def _get_pos_filters(): + """Get default including and excluding filters as frozen sets. + + Returns + ------- + (frozenset of str, frozenset of str) + Including and excluding filters. + + """ return frozenset(INCLUDING_FILTER), frozenset(EXCLUDING_FILTER) def _get_words_for_graph(tokens, pos_filter=None): + """Filters given dictionary of tokens using provided part of speech filters. + + Parameters + ---------- + tokens : dict + Original units (words) as keys and processed units (tokens) as values. + pos_filter : iterable + Part of speech filters, optional. If `None` - using :func:`_get_pos_filters`. + + Returns + ------- + list of str + Filtered tokens. + + Raises + ------ + ValueError + If include and exclude filters ar not empty at the same time. + + """ if pos_filter is None: include_filters, exclude_filters = _get_pos_filters() else: @@ -49,10 +101,37 @@ def _get_words_for_graph(tokens, pos_filter=None): def _get_first_window(split_text): + """Get first :const:`~gensim.parsing.keywords.WINDOW_SIZE` tokens from given `split_text`. + + Parameters + ---------- + split_text : list of str + Splitted text. + + Returns + ------- + list of str + First :const:`~gensim.parsing.keywords.WINDOW_SIZE` tokens. + + """ return split_text[:WINDOW_SIZE] def _set_graph_edge(graph, tokens, word_a, word_b): + """Sets an edge between nodes named word_a and word_b if they exists in `tokens` and `graph`, inplace. + + Parameters + ---------- + graph : :class:~gensim.summarization.graph.Graph + Given graph. + tokens : dict + Original units (words) as keys and processed units (tokens) as values. + word_a : str + First word, name of first node. + word_b : str + Second word, name of second node. + + """ if word_a in tokens and word_b in tokens: lemma_a = tokens[word_a].token lemma_b = tokens[word_b].token @@ -63,12 +142,38 @@ def _set_graph_edge(graph, tokens, word_a, word_b): def _process_first_window(graph, tokens, split_text): + """Sets an edges between nodes taken from first :const:`~gensim.parsing.keywords.WINDOW_SIZE` + words of `split_text` if they exist in `tokens` and `graph`, inplace. + + Parameters + ---------- + graph : :class:~gensim.summarization.graph.Graph + Given graph. + tokens : dict + Original units (words) as keys and processed units (tokens) as values. + split_text : list of str + Splitted text. + + """ first_window = _get_first_window(split_text) for word_a, word_b in _combinations(first_window, 2): _set_graph_edge(graph, tokens, word_a, word_b) def _init_queue(split_text): + """Initialize queue by first words from `split_text`. + + Parameters + ---------- + split_text : list of str + Splitted text. + + Returns + ------- + Queue + Initialized queue. + + """ queue = _Queue() first_window = _get_first_window(split_text) for word in first_window[1:]: @@ -77,17 +182,56 @@ def _init_queue(split_text): def _process_word(graph, tokens, queue, word): + """Sets edge between `word` and each element in queue in `graph` if such nodes + exist in `tokens` and `graph`. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + tokens : dict + Original units (words) as keys and processed units (tokens) as values. + queue : Queue + Given queue. + word : str + Word, possible `node` in graph and item in `tokens`. + + """ for word_to_compare in _queue_iterator(queue): _set_graph_edge(graph, tokens, word, word_to_compare) def _update_queue(queue, word): + """Updates given `queue` (removes last item and puts `word`). + + Parameters + ---------- + queue : Queue + Given queue. + word : str + Word to be added to queue. + + """ queue.get() queue.put(word) assert queue.qsize() == (WINDOW_SIZE - 1) def _process_text(graph, tokens, split_text): + """Process `split_text` by updating given `graph` with new eges between nodes + if they exists in `tokens` and `graph`. + Words are taken from `split_text` with window size :const:`~gensim.parsing.keywords.WINDOW_SIZE`. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + tokens : dict + Original units (words) as keys and processed units (tokens) as values. + split_text : list of str + Splitted text. + + """ queue = _init_queue(split_text) for i in xrange(WINDOW_SIZE, len(split_text)): word = split_text[i] @@ -96,6 +240,19 @@ def _process_text(graph, tokens, split_text): def _queue_iterator(queue): + """Represents iterator of the given queue. + + Parameters + ---------- + queue : Queue + Given queue. + + Yields + ------ + str + Current item of queue. + + """ iterations = queue.qsize() for _ in xrange(iterations): var = queue.get() @@ -104,20 +261,63 @@ def _queue_iterator(queue): def _set_graph_edges(graph, tokens, split_text): + """Updates given `graph` by setting eges between nodes if they exists in `tokens` and `graph`. + Words are taken from `split_text` with window size :const:`~gensim.parsing.keywords.WINDOW_SIZE`. + + Parameters + ---------- + graph : :class:~gensim.summarization.graph.Graph + Given graph. + tokens : dict + Original units (words) as keys and processed units (tokens) as values. + split_text : list of str + Splitted text. + + """ _process_first_window(graph, tokens, split_text) _process_text(graph, tokens, split_text) def _extract_tokens(lemmas, scores, ratio, words): - lemmas.sort(key=lambda s: scores[s], reverse=True) + """Extracts tokens from provided lemmas. Most scored lemmas are used if `words` not provided. + + Parameters + ---------- + lemmas : list of str + Given lemmas. + scores : dict + Dictionary with lemmas and its scores. + ratio : float + Proportion of lemmas used for final result. + words : int + Number of used words. If no "words" option is selected, the number of + sentences is reduced by the provided ratio, else, the ratio is ignored. + + Returns + ------- + list of (float, str) + Scores and corresponded lemmas. - # If no "words" option is selected, the number of sentences is - # reduced by the provided ratio, else, the ratio is ignored. + """ + lemmas.sort(key=lambda s: scores[s], reverse=True) length = len(lemmas) * ratio if words is None else words return [(scores[lemmas[i]], lemmas[i],) for i in range(int(length))] def _lemmas_to_words(tokens): + """Get words and lemmas from given tokens. Produces "reversed" `tokens`. + + Parameters + ---------- + tokens : dict + Original units (words) as keys and processed units (tokens) as values. + + Returns + ------- + dict + Lemmas as keys and lists corresponding words as values. + + """ lemma_to_word = {} for word, unit in iteritems(tokens): lemma = unit.token @@ -129,11 +329,22 @@ def _lemmas_to_words(tokens): def _get_keywords_with_score(extracted_lemmas, lemma_to_word): + """Get words of `extracted_lemmas` and its scores, words contains in `lemma_to_word`. + + Parameters + ---------- + extracted_lemmas : list of (float, str) + Given lemmas with scores + lemma_to_word : dict + Lemmas and corresponding words. + + Returns + ------- + dict + Keywords as keys and its scores as values. + """ - :param extracted_lemmas:list of tuples - :param lemma_to_word: dict of {lemma:list of words} - :return: dict of {keyword:score} - """ + keywords = {} for score, lemma in extracted_lemmas: keyword_list = lemma_to_word[lemma] @@ -143,15 +354,37 @@ def _get_keywords_with_score(extracted_lemmas, lemma_to_word): def _strip_word(word): + """Get cleaned `word`. + + Parameters + ---------- + word : str + Given word. + + Returns + ------- + str + Cleaned word. + """ stripped_word_list = list(_tokenize_by_word(word)) return stripped_word_list[0] if stripped_word_list else "" def _get_combined_keywords(_keywords, split_text): - """ - :param keywords:dict of keywords:scores - :param split_text: list of strings - :return: combined_keywords:list + """Get most scored words (`_keywords`) contained in `split_text` and it's combinations. + + Parameters + ---------- + _keywords : dict + Keywords as keys and its scores as values. + split_text : list of str + Splitted text. + + Returns + ------- + list of str + Keywords and/or its combinations. + """ result = [] _keywords = _keywords.copy() @@ -175,6 +408,21 @@ def _get_combined_keywords(_keywords, split_text): def _get_average_score(concept, _keywords): + """Get average score of words in `concept`. + + Parameters + ---------- + concept : str + Input text. + _keywords : dict + Keywords as keys and its scores as values. + + Returns + ------- + float + Average score. + + """ word_list = concept.split() word_counter = 0 total = 0 @@ -185,9 +433,29 @@ def _get_average_score(concept, _keywords): def _format_results(_keywords, combined_keywords, split, scores): - """ - :param keywords:dict of keywords:scores - :param combined_keywords:list of word/s + """Formats, sorts and returns `combined_keywords` in desired format. + + Parameters + ---------- + _keywords : dict + Keywords as keys and its scores as values. + combined_keywords : list of str + Most ranked words and/or its combinations. + split : bool + Split result if True or return string otherwise, optional. + scores : bool + Whether return `combined_keywords` with scores, optional. If True + `split` is ignored. + + Returns + ------- + result: list of (str, float) + If `scores`, keywords with scores **OR** + result: list of str + If `split`, keywords only **OR** + result: str + Keywords, joined by endl. + """ combined_keywords.sort(key=lambda w: _get_average_score(w, _keywords), reverse=True) if scores: @@ -199,6 +467,39 @@ def _format_results(_keywords, combined_keywords, split, scores): def keywords(text, ratio=0.2, words=None, split=False, scores=False, pos_filter=('NN', 'JJ'), lemmatize=False, deacc=True): + """Get most ranked words of provided text and/or its combinations. + + Parameters + ---------- + + text : str + Input text. + ratio : float, optional + If no "words" option is selected, the number of sentences is reduced by the provided ratio, + else, the ratio is ignored. + words : int, optional + Number of returned words. + split : bool, optional + Whether split keywords if True. + scores : bool, optional + Whether score of keyword. + pos_filter : tuple, optional + Part of speech filters. + lemmatize : bool, optional + If True - lemmatize words. + deacc : bool, optional + If True - remove accentuation. + + Returns + ------- + result: list of (str, float) + If `scores`, keywords with scores **OR** + result: list of str + If `split`, keywords only **OR** + result: str + Keywords, joined by endl. + + """ # Gets a dict of word -> lemma text = to_unicode(text) tokens = _clean_text_by_word(text, deacc=deacc) @@ -233,6 +534,19 @@ def keywords(text, ratio=0.2, words=None, split=False, scores=False, pos_filter= def get_graph(text): + """Creates and returns graph from given text, cleans and tokenize text before building graph. + + Parameters + ---------- + text : str + Sequence of values. + + Returns + ------- + :class:`~gensim.summarization.graph.Graph` + Created graph. + + """ tokens = _clean_text_by_word(text) split_text = list(_tokenize_by_word(text)) diff --git a/gensim/summarization/mz_entropy.py b/gensim/summarization/mz_entropy.py new file mode 100644 index 0000000000..11437f5c86 --- /dev/null +++ b/gensim/summarization/mz_entropy.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + + +from gensim.summarization.textcleaner import tokenize_by_word as _tokenize_by_word +from gensim.utils import to_unicode +import numpy +import scipy + + +def mz_keywords(text, blocksize=1024, scores=False, split=False, weighted=True, threshold=0.0): + """Extract keywords from text using the Montemurro and Zanette entropy algorithm. [1]_ + + Parameters + ---------- + text: str + Document for summarization. + blocksize: int, optional + Size of blocks to use in analysis. + scores: bool, optional + Whether to return score with keywords. + split: bool, optional + Whether to return results as list. + weighted: bool, optional + Whether to weight scores by word frequency. + False can useful for shorter texts, and allows automatic thresholding. + threshold: float or 'auto', optional + Minimum score for returned keywords, 'auto' calculates the threshold as n_blocks / (n_blocks + 1.0) + 1e-8, + use 'auto' with `weighted=False`. + + Returns + ------- + results: str + newline separated keywords if `split` == False **OR** + results: list(str) + list of keywords if `scores` == False **OR** + results: list(tuple(str, float)) + list of (keyword, score) tuples if `scores` == True + + Results are returned in descending order of score regardless of the format. + + Note + ---- + This algorithm looks for keywords that contribute to the structure of the + text on scales of `blocksize` words of larger. It is suitable for extracting + keywords representing the major themes of long texts. + + References + ---------- + .. [1] Marcello A Montemurro, Damian Zanette, "Towards the quantification of the semantic information encoded in + written language". Advances in Complex Systems, Volume 13, Issue 2 (2010), pp. 135-153, + DOI: 10.1142/S0219525910002530, https://arxiv.org/abs/0907.1558 + + """ + text = to_unicode(text) + words = [word for word in _tokenize_by_word(text)] + vocab = sorted(set(words)) + word_counts = numpy.array( + [ + [words[i:i + blocksize].count(word) for word in vocab] + for i in range(0, len(words), blocksize) + ] + ).astype('d') + n_blocks = word_counts.shape[0] + totals = word_counts.sum(axis=0) + n_words = totals.sum() + p = word_counts / totals + log_p = numpy.log2(p) + h = numpy.nan_to_num(p * log_p).sum(axis=0) + analytic = __analytic_entropy(blocksize, n_blocks, n_words) + h += analytic(totals).astype('d') + if weighted: + h *= totals / n_words + if threshold == 'auto': + threshold = n_blocks / (n_blocks + 1.0) + 1.0e-8 + weights = [(word, score) for (word, score) in zip(vocab, h) if score > threshold] + weights.sort(key=lambda x: -x[1]) + result = weights if scores else [word for (word, score) in weights] + if not (scores or split): + result = '\n'.join(result) + return result + + +def __log_combinations_inner(n, m): + """Calculates the logarithm of n!/m!(n-m)!""" + return -(numpy.log(n + 1) + scipy.special.betaln(n - m + 1, m + 1)) + + +__log_combinations = numpy.frompyfunc(__log_combinations_inner, 2, 1) + + +def __marginal_prob(blocksize, n_words): + + def marginal_prob(n, m): + """Marginal probability of a word that occurs n times in the document + occurring m times in a given block""" + + return numpy.exp( + __log_combinations(n, m) + + __log_combinations(n_words - n, blocksize - m) - + __log_combinations(n_words, blocksize) + ) + + return numpy.frompyfunc(marginal_prob, 2, 1) + + +def __analytic_entropy(blocksize, n_blocks, n_words): + marginal = __marginal_prob(blocksize, n_words) + + def analytic_entropy(n): + """Predicted entropy for a word that occurs n times in the document""" + m = numpy.arange(1, min(blocksize, n) + 1).astype('d') + p = m / n + elements = numpy.nan_to_num(p * numpy.log2(p)) * marginal(n, m) + return -n_blocks * elements.sum() + + return numpy.frompyfunc(analytic_entropy, 1, 1) diff --git a/gensim/summarization/pagerank_weighted.py b/gensim/summarization/pagerank_weighted.py index f5a24635a1..df1352367c 100644 --- a/gensim/summarization/pagerank_weighted.py +++ b/gensim/summarization/pagerank_weighted.py @@ -2,6 +2,36 @@ # -*- coding: utf-8 -*- # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + +"""This module calculate PageRank [1]_ based on wordgraph. + + +.. [1] https://en.wikipedia.org/wiki/PageRank + +Examples +-------- + +Calculate Pagerank for words + +>>> from gensim.summarization.keywords import get_graph +>>> from gensim.summarization.pagerank_weighted import pagerank_weighted +>>> graph = get_graph("The road to hell is paved with good intentions.") +>>> # result will looks like {'good': 0.70432858653171504, 'hell': 0.051128871128006126, ...} +>>> result = pagerank_weighted(graph) + +Build matrix from graph + +>>> from gensim.summarization.pagerank_weighted import build_adjacency_matrix +>>> build_adjacency_matrix(graph).todense() +matrix([[ 0., 0., 0., 0., 0.], + [ 0., 0., 1., 0., 0.], + [ 0., 1., 0., 0., 0.], + [ 0., 0., 0., 0., 0.], + [ 0., 0., 0., 0., 0.]]) + +""" + + import numpy from numpy import empty as empty_matrix from scipy.linalg import eig @@ -9,15 +39,23 @@ from scipy.sparse.linalg import eigs from six.moves import xrange -try: - from numpy import VisibleDeprecationWarning - import warnings - warnings.filterwarnings("ignore", category=VisibleDeprecationWarning) -except ImportError: - pass - def pagerank_weighted(graph, damping=0.85): + """Get dictionary of `graph` nodes and its ranks. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + damping : float + Damping parameter, optional + + Returns + ------- + dict + Nodes of `graph` as keys, its ranks as values. + + """ adjacency_matrix = build_adjacency_matrix(graph) probability_matrix = build_probability_matrix(graph) @@ -30,6 +68,19 @@ def pagerank_weighted(graph, damping=0.85): def build_adjacency_matrix(graph): + """Get matrix representation of given `graph`. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + + Returns + ------- + :class:`scipy.sparse.csr_matrix`, shape = [n, n] + Adjacency matrix of given `graph`, n is number of nodes. + + """ row = [] col = [] data = [] @@ -50,6 +101,20 @@ def build_adjacency_matrix(graph): def build_probability_matrix(graph): + """Get square matrix of shape (n, n), where n is number of nodes of the + given `graph`. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + + Returns + ------- + numpy.ndarray, shape = [n, n] + Eigenvector of matrix `a`, n is number of nodes of `graph`. + + """ dimension = len(graph.nodes()) matrix = empty_matrix((dimension, dimension)) @@ -60,6 +125,19 @@ def build_probability_matrix(graph): def principal_eigenvector(a): + """Get eigenvector of square matrix `a`. + + Parameters + ---------- + a : numpy.ndarray, shape = [n, n] + Given matrix. + + Returns + ------- + numpy.ndarray, shape = [n, ] + Eigenvector of matrix `a`. + + """ # Note that we prefer to use `eigs` even for dense matrix # because we need only one eigenvector. See #441, #438 for discussion. @@ -74,6 +152,22 @@ def principal_eigenvector(a): def process_results(graph, vec): + """Get `graph` nodes and corresponding absolute values of provided eigenvector. + This function is helper for :func:`~gensim.summarization.pagerank_weighted.pagerank_weighted` + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + vec : numpy.ndarray, shape = [n, ] + Given eigenvector, n is number of nodes of `graph`. + + Returns + ------- + dict + Graph nodes as keys, corresponding elements of eigenvector as values. + + """ scores = {} for i, node in enumerate(graph.nodes()): scores[node] = abs(vec[i]) diff --git a/gensim/summarization/summarizer.py b/gensim/summarization/summarizer.py index 1b1251b1d7..ee5290e85b 100644 --- a/gensim/summarization/summarizer.py +++ b/gensim/summarization/summarizer.py @@ -3,7 +3,55 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module provides functions for summarizing texts. Summarizing is based on +ranks of text sentences using a variation of the TextRank algorithm [1]_. + +.. [1] Federico Barrios, Federico L´opez, Luis Argerich, Rosita Wachenchauzer (2016). + Variations of the Similarity Function of TextRank for Automated Summarization, + https://arxiv.org/abs/1602.03606 + + +Data +---- + +.. data:: INPUT_MIN_LENGTH - Minimal number of sentences in text +.. data:: WEIGHT_THRESHOLD - Minimal weight of edge between graph nodes. Smaller weights set to zero. + +Example +------- + +>>> from gensim.summarization.summarizer import summarize +>>> text = '''Rice Pudding - Poem by Alan Alexander Milne +... What is the matter with Mary Jane? +... She's crying with all her might and main, +... And she won't eat her dinner - rice pudding again - +... What is the matter with Mary Jane? +... What is the matter with Mary Jane? +... I've promised her dolls and a daisy-chain, +... And a book about animals - all in vain - +... What is the matter with Mary Jane? +... What is the matter with Mary Jane? +... She's perfectly well, and she hasn't a pain; +... But, look at her, now she's beginning again! - +... What is the matter with Mary Jane? +... What is the matter with Mary Jane? +... I've promised her sweets and a ride in the train, +... And I've begged her to stop for a bit and explain - +... What is the matter with Mary Jane? +... What is the matter with Mary Jane? +... She's perfectly well and she hasn't a pain, +... And it's lovely rice pudding for dinner again! +... What is the matter with Mary Jane?''' +>>> print(summarize(text)) +And she won't eat her dinner - rice pudding again - +I've promised her dolls and a daisy-chain, +I've promised her sweets and a ride in the train, +And it's lovely rice pudding for dinner again! + +""" + import logging +from gensim.utils import deprecated from gensim.summarization.pagerank_weighted import pagerank_weighted as _pagerank from gensim.summarization.textcleaner import clean_text_by_sentences as _clean_text_by_sentences from gensim.summarization.commons import build_graph as _build_graph @@ -22,6 +70,15 @@ def _set_graph_edge_weights(graph): + """Sets weights using BM25 algorithm. Leaves small weights as zeroes. If all weights are fairly small, + forces all weights to 1, inplace. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + + """ documents = graph.nodes() weights = _bm25_weights(documents) @@ -48,6 +105,14 @@ def _set_graph_edge_weights(graph): def _create_valid_graph(graph): + """Sets all weights of edges for different edges as 1, inplace. + + Parameters + ---------- + graph : :class:`~gensim.summarization.graph.Graph` + Given graph. + + """ nodes = graph.nodes() for i in xrange(len(nodes)): @@ -63,11 +128,45 @@ def _create_valid_graph(graph): graph.add_edge(edge, 1) +@deprecated("Function will be removed in 4.0.0") def _get_doc_length(doc): + """Get length of (tokenized) document. + + Parameters + ---------- + doc : list of (list of (tuple of int)) + Given document. + + Returns + ------- + int + Length of document. + + """ return sum([item[1] for item in doc]) +@deprecated("Function will be removed in 4.0.0") def _get_similarity(doc1, doc2, vec1, vec2): + """Returns similarity of two documents. + + Parameters + ---------- + doc1 : list of (list of (tuple of int)) + First document. + doc2 : list of (list of (tuple of int)) + Second document. + vec1 : array + ? of first document. + vec1 : array + ? of secont document. + + Returns + ------- + float + Similarity of two documents. + + """ numerator = vec1.dot(vec2.transpose()).toarray()[0][0] length_1 = _get_doc_length(doc1) length_2 = _get_doc_length(doc2) @@ -78,20 +177,63 @@ def _get_similarity(doc1, doc2, vec1, vec2): def _build_corpus(sentences): + """Construct corpus from provided sentences. + + Parameters + ---------- + sentences : list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Given sentences. + + Returns + ------- + list of list of (int, int) + Corpus built from sentences. + + """ split_tokens = [sentence.token.split() for sentence in sentences] dictionary = Dictionary(split_tokens) return [dictionary.doc2bow(token) for token in split_tokens] def _get_important_sentences(sentences, corpus, important_docs): + """Get most important sentences. + + Parameters + ---------- + sentences : list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Given sentences. + corpus : list of list of (int, int) + Provided corpus. + important_docs : list of list of (int, int) + Most important documents of the corpus. + + Returns + ------- + list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Most important sentences. + + """ hashable_corpus = _build_hasheable_corpus(corpus) sentences_by_corpus = dict(zip(hashable_corpus, sentences)) return [sentences_by_corpus[tuple(important_doc)] for important_doc in important_docs] def _get_sentences_with_word_count(sentences, word_count): - """ Given a list of sentences, returns a list of sentences with a - total word count similar to the word count provided.""" + """Get list of sentences. Total number of returned words close to specified `word_count`. + + Parameters + ---------- + sentences : list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Given sentences. + word_count : int or None + Number of returned words. If None full most important sentences will be returned. + + Returns + ------- + list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Most important sentences. + + """ length = 0 selected_sentences = [] @@ -111,6 +253,25 @@ def _get_sentences_with_word_count(sentences, word_count): def _extract_important_sentences(sentences, corpus, important_docs, word_count): + """Get most important sentences of the `corpus`. + + Parameters + ---------- + sentences : list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Given sentences. + corpus : list of list of (int, int) + Provided corpus. + important_docs : list of list of (int, int) + Most important docs of the corpus. + word_count : int + Number of returned words. If None full most important sentences will be returned. + + Returns + ------- + list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Most important sentences. + + """ important_sentences = _get_important_sentences(sentences, corpus, important_docs) # If no "word_count" option is provided, the number of sentences is @@ -121,29 +282,76 @@ def _extract_important_sentences(sentences, corpus, important_docs, word_count): def _format_results(extracted_sentences, split): + """Returns `extracted_sentences` in desired format. + + Parameters + ---------- + extracted_sentences : list of :class:~gensim.summarization.syntactic_unit.SyntacticUnit + Given sentences. + split : bool + If True sentences will be returned as list. Otherwise sentences will be merged and returned as string. + + Returns + ------- + list of str + If `split` **OR** + str + Formatted result. + + """ if split: return [sentence.text for sentence in extracted_sentences] return "\n".join([sentence.text for sentence in extracted_sentences]) def _build_hasheable_corpus(corpus): + """Hashes and get `corpus`. + + Parameters + ---------- + corpus : list of list of (int, int) + Given corpus. + + Returns + ------- + list of list of (int, int) + Hashable corpus. + + """ return [tuple(doc) for doc in corpus] def summarize_corpus(corpus, ratio=0.2): + """Get a list of the most important documents of a corpus using a + variation of the TextRank algorithm [1]. + + Used as helper for summarize :func:`~gensim.summarization.summarizer.summarizer` + + Notes + ----- + The input must have at least :const:`~gensim.summarization.summarizer.INPUT_MIN_LENGTH` documents for the summary + to make sense. + + Parameters + ---------- + corpus : list of list of (int, int) + Given corpus. + ratio : float, optional + Number between 0 and 1 that determines the proportion of the number of + sentences of the original text to be chosen for the summary, optional. + + Returns + ------- + list of str + Most important documents of given `corpus` sorted by the document score, highest first. + + References + ---------- + .. [1] Federico Barrios, Federico L´opez, Luis Argerich, Rosita Wachenchauzer (2016). + Variations of the Similarity Function of TextRank for Automated Summarization, + https://arxiv.org/abs/1602.03606 + """ - Returns a list of the most important documents of a corpus using a - variation of the TextRank algorithm. - The input must have at least INPUT_MIN_LENGTH (%d) documents for the - summary to make sense. - - The length of the output can be specified using the ratio parameter, - which determines how many documents will be chosen for the summary - (defaults at 20%% of the number of documents of the corpus). - - The most important documents are returned as a list sorted by the - document score, highest first. - """ % INPUT_MIN_LENGTH hashable_corpus = _build_hasheable_corpus(corpus) # If the corpus is empty, the function ends. @@ -173,29 +381,39 @@ def summarize_corpus(corpus, ratio=0.2): def summarize(text, ratio=0.2, word_count=None, split=False): - """ - Returns a summarized version of the given text using a variation of - the TextRank algorithm (see https://arxiv.org/abs/1602.03606). + """Get a summarized version of the given text. The output summary will consist of the most representative sentences and will be returned as a string, divided by newlines. - If the split parameter is set to True, a list of sentences will be - returned instead. - - The input should be a string, and must be longer than - INPUT_MIN_LENGTH sentences for the summary to make sense. The text - will be split into sentences using the split_sentences method in the - summarization.texcleaner module. - Note that newlines divide sentences. - - The length of the output can be specified using the ratio and - word_count parameters: - - ratio should be a number between 0 and 1 that determines the - percentage of the number of sentences of the original text to be - chosen for the summary (defaults at 0.2). - word_count determines how many words will the output contain. + + Note + ---- + The input should be a string, and must be longer than :const:`~gensim.summarization.summarizer.INPUT_MIN_LENGTH` + sentences for the summary to make sense. + The text will be split into sentences using the split_sentences method in the :mod:`gensim.summarization.texcleaner` + module. Note that newlines divide sentences. + + + Parameters + ---------- + text : str + Given text. + ratio : float, optional + Number between 0 and 1 that determines the proportion of the number of + sentences of the original text to be chosen for the summary. + word_count : int or None, optional + Determines how many words will the output contain. If both parameters are provided, the ratio will be ignored. + split : bool, optional + If True, list of sentences will be returned. Otherwise joined + strings will bwe returned. + + Returns + ------- + list of str + If `split` **OR** + str + Most representative sentences of given the text. """ # Gets a list of processed sentences. diff --git a/gensim/summarization/syntactic_unit.py b/gensim/summarization/syntactic_unit.py index 89842e1122..335ee6a212 100644 --- a/gensim/summarization/syntactic_unit.py +++ b/gensim/summarization/syntactic_unit.py @@ -3,13 +3,46 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module contains implementation of SyntacticUnit class. It generally used while text cleaning. +:class:`~gensim.summarization.syntactic_unit.SyntacticUnit` represents printable version of provided text. + +""" + class SyntacticUnit(object): + """SyntacticUnit class. + + Attributes + ---------- + text : str + Input text. + token : str + Tokenized text. + tag : str + Tag of unit, optional. + index : int + Index of sytactic unit in corpus, optional. + score : float + Score of synctatic unit, optional. + + """ def __init__(self, text, token=None, tag=None): + """ + + Parameters + ---------- + text : str + Input text. + token : str + Tokenized text, optional. + tag : str + Tag of unit, optional. + + """ self.text = text self.token = token - self.tag = tag[:2] if tag else None # Just first two letters of tag + self.tag = tag[:2] if tag else None # Just first two letters of tag self.index = -1 self.score = -1 diff --git a/gensim/summarization/textcleaner.py b/gensim/summarization/textcleaner.py index 4829d9f892..5af6bef257 100644 --- a/gensim/summarization/textcleaner.py +++ b/gensim/summarization/textcleaner.py @@ -3,6 +3,23 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module contains functions and processors used for processing text, +extracting sentences from text, working with acronyms and abbreviations. + +Data +---- + +.. data:: SEPARATOR - Special separator used in abbreviations. +.. data:: RE_SENTENCE - Pattern to split text to sentences. +.. data:: AB_SENIOR - Pattern for detecting abbreviations (example: Sgt. Pepper). +.. data:: AB_ACRONYM - Pattern for detecting acronyms. +.. data:: AB_ACRONYM_LETTERS - Pattern for detecting acronyms (example: P.S. I love you). +.. data:: UNDO_AB_SENIOR - Pattern like AB_SENIOR but with SEPARATOR between abbreviation and next word. +.. data:: UNDO_AB_ACRONYM - Pattern like AB_ACRONYM but with SEPARATOR between abbreviation and next word. + +""" + + from gensim.summarization.syntactic_unit import SyntacticUnit from gensim.parsing.preprocessing import preprocess_documents from gensim.utils import tokenize @@ -10,7 +27,7 @@ import re import logging -logger = logging.getLogger('summa.preprocessing.cleaner') +logger = logging.getLogger('summarizer.preprocessing.cleaner') try: from pattern.en import tag @@ -31,19 +48,96 @@ def split_sentences(text): + """Split and get list of sentences from given text. It preserves abbreviations set in + :const:`~gensim.summarization.textcleaner.AB_SENIOR` and :const:`~gensim.summarization.textcleaner.AB_ACRONYM`. + + Parameters + ---------- + text : str + Input text. + + Returns + ------- + list of str + Sentences of given text. + + Example + ------- + >>> from gensim.summarization.textcleaner import split_sentences + >>> text = '''Beautiful is better than ugly. + ... Explicit is better than implicit. Simple is better than complex.''' + >>> split_sentences(text) + ['Beautiful is better than ugly.', + 'Explicit is better than implicit.', + 'Simple is better than complex.'] + + """ processed = replace_abbreviations(text) return [undo_replacement(sentence) for sentence in get_sentences(processed)] def replace_abbreviations(text): + """Replace blank space to '@' separator after abbreviation and next word. + + Parameters + ---------- + text : str + Input sentence. + + Returns + ------- + str + Sentence with changed separator. + + Example + ------- + >>> replace_abbreviations("God bless you, please, Mrs. Robinson") + God bless you, please, Mrs.@Robinson + + """ return replace_with_separator(text, SEPARATOR, [AB_SENIOR, AB_ACRONYM]) def undo_replacement(sentence): + """Replace `@` separator back to blank space after each abbreviation. + + Parameters + ---------- + sentence : str + Input sentence. + + Returns + ------- + str + Sentence with changed separator. + + Example + ------- + >>> undo_replacement("God bless you, please, Mrs.@Robinson") + God bless you, please, Mrs. Robinson + + """ return replace_with_separator(sentence, r" ", [UNDO_AB_SENIOR, UNDO_AB_ACRONYM]) def replace_with_separator(text, separator, regexs): + """Get text with replaced separator if provided regular expressions were matched. + + Parameters + ---------- + text : str + Input text. + separator : str + The separator between words to be replaced. + regexs : list of `_sre.SRE_Pattern` + Regular expressions used in processing text. + + Returns + ------- + str + Text with replaced separators. + + """ replacement = r"\1" + separator + r"\2" result = text for regex in regexs: @@ -52,11 +146,51 @@ def replace_with_separator(text, separator, regexs): def get_sentences(text): + """Sentence generator from provided text. Sentence pattern set + in :const:`~gensim.summarization.textcleaner.RE_SENTENCE`. + + Parameters + ---------- + text : str + Input text. + + Yields + ------ + str + Single sentence extracted from text. + + Example + ------- + >>> text = "Does this text contains two sentences? Yes, it does." + >>> for sentence in get_sentences(text): + >>> print(sentence) + Does this text contains two sentences? + Yes, it does. + + """ for match in RE_SENTENCE.finditer(text): yield match.group() def merge_syntactic_units(original_units, filtered_units, tags=None): + """Process given sentences and its filtered (tokenized) copies into + :class:`~gensim.summarization.syntactic_unit.SyntacticUnit`. Also adds tags if they are provided to produced units. + + Parameters + ---------- + original_units : list + List of original sentences. + filtered_units : list + List of tokenized sentences. + tags : list of str, optional + List of strings used as tags for each unit. None as deafault. + + Returns + ------- + list of :class:~gensim.summarization.syntactic_unit.SyntacticUnit + List of syntactic units (sentences). + + """ units = [] for i in xrange(len(original_units)): if filtered_units[i] == '': @@ -74,12 +208,38 @@ def merge_syntactic_units(original_units, filtered_units, tags=None): def join_words(words, separator=" "): + """Concatenates `words` with `separator` between elements. + + Parameters + ---------- + words : list of str + Given words. + separator : str, optional + The separator between elements. + + Returns + ------- + str + String of merged words with separator between elements. + + """ return separator.join(words) def clean_text_by_sentences(text): - """ Tokenizes a given text into sentences, applying filters and lemmatizing them. - Returns a SyntacticUnit list. """ + """Tokenize a given text into sentences, applying filters and lemmatize them. + + Parameters + ---------- + text : str + Given text. + + Returns + ------- + list of :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` + Sentences of the given text. + + """ original_sentences = split_sentences(text) filtered_sentences = [join_words(sentence) for sentence in preprocess_documents(original_sentences)] @@ -87,8 +247,29 @@ def clean_text_by_sentences(text): def clean_text_by_word(text, deacc=True): - """ Tokenizes a given text into words, applying filters and lemmatizing them. - Returns a dict of word -> syntacticUnit. """ + """Tokenize a given text into words, applying filters and lemmatize them. + + Parameters + ---------- + text : str + Given text. + deacc : bool, optional + Remove accentuation if True. + + Returns + ------- + dict + Words as keys, :class:`~gensim.summarization.syntactic_unit.SyntacticUnit` as values. + + Example + ------- + >>> from gensim.summarization.textcleaner import clean_text_by_word + >>> clean_text_by_word("God helps those who help themselves") + {'god': Original unit: 'god' *-*-*-* Processed unit: 'god', + 'help': Original unit: 'help' *-*-*-* Processed unit: 'help', + 'helps': Original unit: 'helps' *-*-*-* Processed unit: 'help'} + + """ text_without_acronyms = replace_with_separator(text, "", [AB_ACRONYM_LETTERS]) original_words = list(tokenize(text_without_acronyms, to_lower=True, deacc=deacc)) filtered_words = [join_words(word_list, "") for word_list in preprocess_documents(original_words)] @@ -101,5 +282,30 @@ def clean_text_by_word(text, deacc=True): def tokenize_by_word(text): + """Tokenize input text. Before tokenizing transforms text to lower case and removes accentuation and acronyms set + :const:`~gensim.summarization.textcleaner.AB_ACRONYM_LETTERS`. + + Parameters + ---------- + text : str + Given text. + + Returns + ------- + generator + Generator that yields sequence words of the given text. + + Example + ------- + >>> from gensim.summarization.textcleaner import tokenize_by_word + >>> g = tokenize_by_word('Veni. Vedi. Vici.') + >>> print(next(g)) + veni + >>> print(next(g)) + vedi + >>> print(next(g)) + vici + + """ text_without_acronyms = replace_with_separator(text, "", [AB_ACRONYM_LETTERS]) return tokenize(text_without_acronyms, to_lower=True, deacc=True) diff --git a/gensim/test/test_data/poincare_cp852.tsv b/gensim/test/test_data/poincare_cp852.tsv new file mode 100644 index 0000000000..49fd37436a --- /dev/null +++ b/gensim/test/test_data/poincare_cp852.tsv @@ -0,0 +1,2 @@ +tmto bude +budem byli \ No newline at end of file diff --git a/gensim/test/test_data/poincare_hypernyms.tsv b/gensim/test/test_data/poincare_hypernyms.tsv new file mode 100644 index 0000000000..b920bb0dab --- /dev/null +++ b/gensim/test/test_data/poincare_hypernyms.tsv @@ -0,0 +1,5 @@ +kangaroo.n.01 marsupial.n.01 +kangaroo.n.01 metatherian.n.01 +kangaroo.n.01 mammal.n.01 +gib.n.02 cat.n.01 +striped_skunk.n.01 mammal.n.01 \ No newline at end of file diff --git a/gensim/test/test_data/poincare_hypernyms_large.tsv b/gensim/test/test_data/poincare_hypernyms_large.tsv new file mode 100644 index 0000000000..3d93ca1ef7 --- /dev/null +++ b/gensim/test/test_data/poincare_hypernyms_large.tsv @@ -0,0 +1,95 @@ +kangaroo.n.01 marsupial.n.01 +kangaroo.n.01 metatherian.n.01 +kangaroo.n.01 mammal.n.01 +gib.n.02 cat.n.01 +striped_skunk.n.01 mammal.n.01 +domestic_goat.n.01 even-toed_ungulate.n.01 +rock_squirrel.n.01 ground_squirrel.n.02 +vizsla.n.01 dog.n.01 +dandie_dinmont.n.01 mammal.n.01 +broodmare.n.01 horse.n.01 +spotted_skunk.n.01 spotted_skunk.n.01 +hispid_pocket_mouse.n.01 hispid_pocket_mouse.n.01 +lesser_kudu.n.01 placental.n.01 +water_shrew.n.01 insectivore.n.01 +silky_anteater.n.01 placental.n.01 +giant_kangaroo.n.01 metatherian.n.01 +bronco.n.01 bronco.n.01 +pekinese.n.01 pekinese.n.01 +seattle_slew.n.01 thoroughbred.n.02 +kinkajou.n.01 kinkajou.n.01 +boxer.n.04 mammal.n.01 +rabbit.n.01 placental.n.01 +longhorn.n.01 bovid.n.01 +blue_fox.n.01 fox.n.01 +woolly_monkey.n.01 new_world_monkey.n.01 +jungle_cat.n.01 jungle_cat.n.01 +vole.n.01 mammal.n.01 +western_big-eared_bat.n.01 long-eared_bat.n.01 +leopard.n.02 leopard.n.02 +hackney.n.02 hackney.n.02 +shetland_sheepdog.n.01 placental.n.01 +coati.n.01 carnivore.n.01 +wild_boar.n.01 mammal.n.01 +post_horse.n.01 placental.n.01 +porker.n.01 porker.n.01 +mouflon.n.01 mouflon.n.01 +australian_sea_lion.n.01 seal.n.09 +coondog.n.01 placental.n.01 +schipperke.n.01 mammal.n.01 +black_rat.n.01 rodent.n.01 +waterbuck.n.01 placental.n.01 +hack.n.06 odd-toed_ungulate.n.01 +central_chimpanzee.n.01 anthropoid_ape.n.01 +harrier.n.02 harrier.n.02 +lesser_panda.n.01 mammal.n.01 +wether.n.01 ruminant.n.01 +collie.n.01 shepherd_dog.n.01 +prancer.n.01 horse.n.01 +doberman.n.01 placental.n.01 +pygmy_marmoset.n.01 monkey.n.01 +phalanger.n.01 metatherian.n.01 +black-and-tan_coonhound.n.01 black-and-tan_coonhound.n.01 +woolly_monkey.n.01 primate.n.02 +ferret_badger.n.01 badger.n.02 +mountain_chinchilla.n.01 placental.n.01 +english_foxhound.n.01 english_foxhound.n.01 +leveret.n.01 leporid.n.01 +shetland_sheepdog.n.01 canine.n.02 +beagle.n.01 beagle.n.01 +tibetan_mastiff.n.01 tibetan_mastiff.n.01 +bouvier_des_flandres.n.01 canine.n.02 +wheel_horse.n.01 placental.n.01 +pocket_rat.n.01 rat.n.01 +malinois.n.01 working_dog.n.01 +white_elephant.n.02 white_elephant.n.02 +camel.n.01 camel.n.01 +mexican_pocket_mouse.n.01 rat.n.01 +vaquita.n.01 toothed_whale.n.01 +manchester_terrier.n.01 hunting_dog.n.01 +chacma.n.01 monkey.n.01 +binturong.n.01 viverrine.n.01 +mastiff_bat.n.01 mammal.n.01 +goat.n.01 mammal.n.01 +pembroke.n.01 canine.n.02 +steenbok.n.01 ungulate.n.01 +tarsius_syrichta.n.01 mammal.n.01 +maltese.n.03 domestic_cat.n.01 +pacific_bottlenose_dolphin.n.01 toothed_whale.n.01 +tamandua.n.01 tamandua.n.01 +murine.n.01 rodent.n.01 +coyote.n.01 canine.n.02 +king_charles_spaniel.n.01 placental.n.01 +basset.n.01 canine.n.02 +pygmy_mouse.n.01 pygmy_mouse.n.01 +toy_spaniel.n.01 carnivore.n.01 +cactus_mouse.n.01 mouse.n.01 +hart.n.03 ruminant.n.01 +broodmare.n.01 equine.n.01 +sussex_spaniel.n.01 sporting_dog.n.01 +omaha.n.04 odd-toed_ungulate.n.01 +alaska_fur_seal.n.01 placental.n.01 +cattalo.n.01 bovine.n.01 +soft-coated_wheaten_terrier.n.01 mammal.n.01 +harness_horse.n.01 horse.n.01 +banteng.n.01 even-toed_ungulate.n.01 \ No newline at end of file diff --git a/gensim/test/test_data/poincare_utf8.tsv b/gensim/test/test_data/poincare_utf8.tsv new file mode 100644 index 0000000000..97003c93c1 --- /dev/null +++ b/gensim/test/test_data/poincare_utf8.tsv @@ -0,0 +1,2 @@ +tímto budeš +budem byli \ No newline at end of file diff --git a/gensim/test/test_fasttext.py b/gensim/test/test_fasttext.py index 69aa9d074a..5f630877f7 100644 --- a/gensim/test/test_fasttext.py +++ b/gensim/test/test_fasttext.py @@ -9,6 +9,7 @@ import numpy as np from gensim import utils +from gensim.models import keyedvectors from gensim.models.word2vec import LineSentence from gensim.models.fasttext import FastText as FT_gensim from gensim.models.wrappers.fasttext import FastTextKeyedVectors @@ -419,9 +420,12 @@ def online_sanity(self, model): self.assertTrue(all(['terrorism' not in l for l in others])) model.build_vocab(others) model.train(others, total_examples=model.corpus_count, epochs=model.iter) + # checks that `syn0` is different from `syn0_vocab` + self.assertFalse(np.all(np.equal(model.wv.syn0, model.wv.syn0_vocab))) self.assertFalse('terrorism' in model.wv.vocab) self.assertFalse('orism>' in model.wv.ngrams) model.build_vocab(terro, update=True) # update vocab + self.assertTrue(model.wv.syn0_ngrams.dtype == 'float32') self.assertTrue('terrorism' in model.wv.vocab) self.assertTrue('orism>' in model.wv.ngrams) orig0_all = np.copy(model.wv.syn0_ngrams) @@ -455,6 +459,31 @@ def test_cbow_neg_online(self): ) self.online_sanity(model) + def test_get_vocab_word_vecs(self): + model = FT_gensim(size=10, min_count=1, seed=42) + model.build_vocab(sentences) + original_syn0_vocab = np.copy(model.wv.syn0_vocab) + model.get_vocab_word_vecs() + self.assertTrue(np.all(np.equal(model.wv.syn0_vocab, original_syn0_vocab))) + + def test_persistence_word2vec_format(self): + """Test storing/loading the model in word2vec format.""" + tmpf = get_tmpfile('gensim_fasttext_w2v_format.tst') + model = FT_gensim(sentences, min_count=1, size=10) + model.wv.save_word2vec_format(tmpf, binary=True) + loaded_model_kv = keyedvectors.KeyedVectors.load_word2vec_format(tmpf, binary=True) + self.assertEqual(len(model.wv.vocab), len(loaded_model_kv.vocab)) + self.assertTrue(np.allclose(model['human'], loaded_model_kv['human'])) + self.assertRaises(DeprecationWarning, FT_gensim.load_word2vec_format, tmpf) + self.assertRaises(NotImplementedError, FastTextKeyedVectors.load_word2vec_format, tmpf) + + def test_bucket_ngrams(self): + model = FT_gensim(size=10, min_count=1, bucket=20) + model.build_vocab(sentences) + self.assertEqual(model.wv.syn0_ngrams.shape, (20, 10)) + model.build_vocab(new_sentences, update=True) + self.assertEqual(model.wv.syn0_ngrams.shape, (20, 10)) + if __name__ == '__main__': logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG) diff --git a/gensim/test/test_keyedvectors.py b/gensim/test/test_keyedvectors.py new file mode 100644 index 0000000000..8789ec38b3 --- /dev/null +++ b/gensim/test/test_keyedvectors.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Author: Jayant Jain +# Copyright (C) 2017 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + +""" +Automated tests for checking the poincare module from the models package. +""" + +import logging +import unittest + +import numpy as np + +from gensim.models.keyedvectors import EuclideanKeyedVectors +from gensim.test.utils import datapath + + +logger = logging.getLogger(__name__) + + +class TestEuclideanKeyedVectors(unittest.TestCase): + def setUp(self): + self.vectors = EuclideanKeyedVectors.load_word2vec_format( + datapath('euclidean_vectors.bin'), binary=True, datatype=np.float64) + + def test_most_similar(self): + """Test most_similar returns expected results.""" + expected = [ + 'conflict', + 'administration', + 'terrorism', + 'call', + 'israel' + ] + predicted = [result[0] for result in self.vectors.most_similar('war', topn=5)] + self.assertEqual(expected, predicted) + + def test_most_similar_topn(self): + """Test most_similar returns correct results when `topn` is specified.""" + self.assertEqual(len(self.vectors.most_similar('war', topn=5)), 5) + self.assertEqual(len(self.vectors.most_similar('war', topn=10)), 10) + + predicted = self.vectors.most_similar('war', topn=None) + self.assertEqual(len(predicted), len(self.vectors.vocab)) + + def test_most_similar_raises_keyerror(self): + """Test most_similar raises KeyError when input is out of vocab.""" + with self.assertRaises(KeyError): + self.vectors.most_similar('not_in_vocab') + + def test_most_similar_restrict_vocab(self): + """Test most_similar returns handles restrict_vocab correctly.""" + expected = set(self.vectors.index2word[:5]) + predicted = set(result[0] for result in self.vectors.most_similar('war', topn=5, restrict_vocab=5)) + self.assertEqual(expected, predicted) + + def test_most_similar_with_vector_input(self): + """Test most_similar returns expected results with an input vector instead of an input word.""" + expected = [ + 'war', + 'conflict', + 'administration', + 'terrorism', + 'call', + ] + input_vector = self.vectors['war'] + predicted = [result[0] for result in self.vectors.most_similar([input_vector], topn=5)] + self.assertEqual(expected, predicted) + + def test_most_similar_to_given(self): + """Test most_similar_to_given returns correct results.""" + predicted = self.vectors.most_similar_to_given('war', ['terrorism', 'call', 'waging']) + self.assertEqual(predicted, 'terrorism') + + def test_similar_by_word(self): + """Test similar_by_word returns expected results.""" + expected = [ + 'conflict', + 'administration', + 'terrorism', + 'call', + 'israel' + ] + predicted = [result[0] for result in self.vectors.similar_by_word('war', topn=5)] + self.assertEqual(expected, predicted) + + def test_similar_by_vector(self): + """Test similar_by_word returns expected results.""" + expected = [ + 'war', + 'conflict', + 'administration', + 'terrorism', + 'call', + ] + input_vector = self.vectors['war'] + predicted = [result[0] for result in self.vectors.similar_by_vector(input_vector, topn=5)] + self.assertEqual(expected, predicted) + + def test_distance(self): + """Test that distance returns expected values.""" + self.assertTrue(np.allclose(self.vectors.distance('war', 'conflict'), 0.06694602)) + self.assertEqual(self.vectors.distance('war', 'war'), 0) + + def test_similarity(self): + """Test similarity returns expected value for two words, and for identical words.""" + self.assertTrue(np.allclose(self.vectors.similarity('war', 'war'), 1)) + self.assertTrue(np.allclose(self.vectors.similarity('war', 'conflict'), 0.93305397)) + + def test_words_closer_than(self): + """Test words_closer_than returns expected value for distinct and identical nodes.""" + self.assertEqual(self.vectors.words_closer_than('war', 'war'), []) + expected = set(['conflict', 'administration']) + self.assertEqual(set(self.vectors.words_closer_than('war', 'terrorism')), expected) + + def test_rank(self): + """Test rank returns expected value for distinct and identical nodes.""" + self.assertEqual(self.vectors.rank('war', 'war'), 1) + self.assertEqual(self.vectors.rank('war', 'terrorism'), 3) + + +if __name__ == '__main__': + logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG) + unittest.main() diff --git a/gensim/test/test_phrases.py b/gensim/test/test_phrases.py index e3a69760ca..f0e9cea864 100644 --- a/gensim/test/test_phrases.py +++ b/gensim/test/test_phrases.py @@ -10,15 +10,13 @@ import logging import unittest -import os -import sys -from gensim import utils -from gensim.models.phrases import SentenceAnalyzer, Phrases, Phraser, pseudocorpus -from gensim.test.utils import common_texts +import six -if sys.version_info[0] >= 3: - unicode = str +from gensim.utils import to_unicode +from gensim.models.phrases import SentenceAnalyzer, Phrases, Phraser +from gensim.models.phrases import pseudocorpus, original_scorer +from gensim.test.utils import common_texts, temporary_file, datapath class TestUtils(unittest.TestCase): @@ -138,7 +136,7 @@ class PhrasesData: sentences = common_texts + [ ['graph', 'minors', 'survey', 'human', 'interface'] ] - unicode_sentences = [[utils.to_unicode(w) for w in sentence] for sentence in sentences] + unicode_sentences = [[to_unicode(w) for w in sentence] for sentence in sentences] common_terms = frozenset() bigram1 = u'response_time' @@ -230,7 +228,7 @@ def testEncoding(self): self.assertEqual(self.bigram_unicode[self.sentences[1]], expected) transformed = ' '.join(self.bigram_utf8[self.sentences[1]]) - self.assertTrue(isinstance(transformed, unicode)) + self.assertTrue(isinstance(transformed, six.text_type)) # scorer for testCustomScorer @@ -335,15 +333,15 @@ def testPruning(self): # endclass TestPhrasesModel -class TestPhrasesScoringPersistence(PhrasesData, unittest.TestCase): +class TestPhrasesPersistence(PhrasesData, unittest.TestCase): def testSaveLoadCustomScorer(self): """ saving and loading a Phrases object with a custom scorer """ - try: + with temporary_file("test.pkl") as fpath: bigram = Phrases(self.sentences, min_count=1, threshold=.001, scoring=dumb_scorer) - bigram.save("test_phrases_testSaveLoadCustomScorer_temp_save.pkl") - bigram_loaded = Phrases.load("test_phrases_testSaveLoadCustomScorer_temp_save.pkl") + bigram.save(fpath) + bigram_loaded = Phrases.load(fpath) seen_scores = [] test_sentences = [['graph', 'minors', 'survey', 'human', 'interface', 'system']] for phrase, score in bigram_loaded.export_phrases(test_sentences): @@ -352,17 +350,13 @@ def testSaveLoadCustomScorer(self): assert all(seen_scores) # all scores 1 assert len(seen_scores) == 3 # 'graph minors' and 'survey human' and 'interface system' - finally: - if os.path.exists("test_phrases_testSaveLoadCustomScorer_temp_save.pkl"): - os.remove("test_phrases_testSaveLoadCustomScorer_temp_save.pkl") - def testSaveLoad(self): """ Saving and loading a Phrases object.""" - try: + with temporary_file("test.pkl") as fpath: bigram = Phrases(self.sentences, min_count=1, threshold=1) - bigram.save("test_phrases_testSaveLoad_temp_save.pkl") - bigram_loaded = Phrases.load("test_phrases_testSaveLoad_temp_save.pkl") + bigram.save(fpath) + bigram_loaded = Phrases.load(fpath) seen_scores = set() test_sentences = [['graph', 'minors', 'survey', 'human', 'interface', 'system']] for phrase, score in bigram_loaded.export_phrases(test_sentences): @@ -373,55 +367,85 @@ def testSaveLoad(self): 3.444 # score for human interface ]) - finally: - if os.path.exists("test_phrases_testSaveLoad_temp_save.pkl"): - os.remove("test_phrases_testSaveLoad_temp_save.pkl") - def testSaveLoadStringScoring(self): """ Saving and loading a Phrases object with a string scoring parameter. This should ensure backwards compatibility with the previous version of Phrases""" + bigram_loaded = Phrases.load(datapath("phrases-scoring-str.pkl")) + seen_scores = set() + test_sentences = [['graph', 'minors', 'survey', 'human', 'interface', 'system']] + for phrase, score in bigram_loaded.export_phrases(test_sentences): + seen_scores.add(round(score, 3)) - try: - bigram = Phrases(self.sentences, min_count=1, threshold=1) - bigram.scoring = "default" - bigram.save("test_phrases_testSaveLoadStringScoring_temp_save.pkl") - bigram_loaded = Phrases.load("test_phrases_testSaveLoadStringScoring_temp_save.pkl") - seen_scores = set() - test_sentences = [['graph', 'minors', 'survey', 'human', 'interface', 'system']] - for phrase, score in bigram_loaded.export_phrases(test_sentences): - seen_scores.add(round(score, 3)) - - assert seen_scores == set([ - 5.167, # score for graph minors - 3.444 # score for human interface - ]) - - finally: - if os.path.exists("test_phrases_testSaveLoadStringScoring_temp_save.pkl"): - os.remove("test_phrases_testSaveLoadStringScoring_temp_save.pkl") + assert seen_scores == set([ + 5.167, # score for graph minors + 3.444 # score for human interface + ]) def testSaveLoadNoScoring(self): """ Saving and loading a Phrases object with no scoring parameter. This should ensure backwards compatibility with old versions of Phrases""" - try: - bigram = Phrases(self.sentences, min_count=1, threshold=1) - del(bigram.scoring) - bigram.save("test_phrases_testSaveLoadNoScoring_temp_save.pkl") - bigram_loaded = Phrases.load("test_phrases_testSaveLoadNoScoring_temp_save.pkl") - seen_scores = set() - test_sentences = [['graph', 'minors', 'survey', 'human', 'interface', 'system']] - for phrase, score in bigram_loaded.export_phrases(test_sentences): - seen_scores.add(round(score, 3)) + bigram_loaded = Phrases.load(datapath("phrases-no-scoring.pkl")) + seen_scores = set() + test_sentences = [['graph', 'minors', 'survey', 'human', 'interface', 'system']] + for phrase, score in bigram_loaded.export_phrases(test_sentences): + seen_scores.add(round(score, 3)) - assert seen_scores == set([ - 5.167, # score for graph minors - 3.444 # score for human interface - ]) + assert seen_scores == set([ + 5.167, # score for graph minors + 3.444 # score for human interface + ]) + + def testSaveLoadNoCommonTerms(self): + """ Ensure backwards compatibility with old versions of Phrases, before common_terms""" + bigram_loaded = Phrases.load(datapath("phrases-no-common-terms.pkl")) + self.assertEqual(bigram_loaded.common_terms, frozenset()) + # can make a phraser, cf #1751 + phraser = Phraser(bigram_loaded) # does not raise + phraser[["human", "interface", "survey"]] # does not raise + + +class TestPhraserPersistence(PhrasesData, unittest.TestCase): + + def testSaveLoadCustomScorer(self): + """Saving and loading a Phraser object with a custom scorer """ + + with temporary_file("test.pkl") as fpath: + bigram = Phraser( + Phrases(self.sentences, min_count=1, threshold=.001, scoring=dumb_scorer)) + bigram.save(fpath) + bigram_loaded = Phraser.load(fpath) + # we do not much with scoring, just verify its the one expected + self.assertEqual(bigram_loaded.scoring, dumb_scorer) + + def testSaveLoad(self): + """ Saving and loading a Phraser object.""" + with temporary_file("test.pkl") as fpath: + bigram = Phraser(Phrases(self.sentences, min_count=1, threshold=1)) + bigram.save(fpath) + bigram_loaded = Phraser.load(fpath) + self.assertEqual( + bigram_loaded[['graph', 'minors', 'survey', 'human', 'interface', 'system']], + ['graph_minors', 'survey', 'human_interface', 'system']) + + def testSaveLoadStringScoring(self): + """ Saving and loading a Phraser object with a string scoring parameter. + This should ensure backwards compatibility with the previous version of Phraser""" + bigram_loaded = Phraser.load(datapath("phraser-scoring-str.pkl")) + # we do not much with scoring, just verify its the one expected + self.assertEqual(bigram_loaded.scoring, original_scorer) + + def testSaveLoadNoScoring(self): + """ Saving and loading a Phraser object with no scoring parameter. + This should ensure backwards compatibility with old versions of Phraser""" + bigram_loaded = Phraser.load(datapath("phraser-no-scoring.pkl")) + # we do not much with scoring, just verify its the one expected + self.assertEqual(bigram_loaded.scoring, original_scorer) - finally: - if os.path.exists("test_phrases_testSaveLoadNoScoring_temp_save.pkl"): - os.remove("test_phrases_testSaveLoadNoScoring_temp_save.pkl") + def testSaveLoadNoCommonTerms(self): + """ Ensure backwards compatibility with old versions of Phraser, before common_terms""" + bigram_loaded = Phraser.load(datapath("phraser-no-common-terms.pkl")) + self.assertEqual(bigram_loaded.common_terms, frozenset()) class TestPhraserModel(PhrasesData, PhrasesCommon, unittest.TestCase): @@ -461,7 +485,7 @@ class CommonTermsPhrasesData: ['data', 'and', 'graph', 'survey'], ['data', 'and', 'graph', 'survey', 'for', 'human', 'interface'] # test bigrams within same sentence ] - unicode_sentences = [[utils.to_unicode(w) for w in sentence] for sentence in sentences] + unicode_sentences = [[to_unicode(w) for w in sentence] for sentence in sentences] common_terms = ['of', 'and', 'for'] bigram1 = u'lack_of_interest' @@ -486,7 +510,7 @@ def testEncoding(self): self.assertEqual(self.bigram_unicode[self.sentences[1]], expected) transformed = ' '.join(self.bigram_utf8[self.sentences[1]]) - self.assertTrue(isinstance(transformed, unicode)) + self.assertTrue(isinstance(transformed, six.text_type)) def testMultipleBigramsSingleEntry(self): """ a single entry should produce multiple bigrams. """ @@ -593,7 +617,7 @@ def testEncoding(self): self.assertEqual(self.bigram_unicode[self.sentences[1]], expected) transformed = ' '.join(self.bigram_utf8[self.sentences[1]]) - self.assertTrue(isinstance(transformed, unicode)) + self.assertTrue(isinstance(transformed, six.text_type)) if __name__ == '__main__': diff --git a/gensim/test/test_poincare.py b/gensim/test/test_poincare.py new file mode 100644 index 0000000000..226add5da2 --- /dev/null +++ b/gensim/test/test_poincare.py @@ -0,0 +1,365 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Author: Jayant Jain +# Copyright (C) 2017 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + +""" +Automated tests for checking the poincare module from the models package. +""" + +import logging +import os +import tempfile +import unittest +try: + from mock import Mock +except ImportError: + from unittest.mock import Mock + +import numpy as np +try: + import autograd # noqa:F401 + autograd_installed = True +except ImportError: + autograd_installed = False + +from gensim.models.poincare import PoincareRelations, PoincareModel, PoincareKeyedVectors +from gensim.test.utils import datapath + + +logger = logging.getLogger(__name__) + + +def testfile(): + # temporary data will be stored to this file + return os.path.join(tempfile.gettempdir(), 'gensim_word2vec.tst') + + +class TestPoincareData(unittest.TestCase): + def test_encoding_handling(self): + """Tests whether utf8 and non-utf8 data loaded correctly.""" + non_utf8_file = datapath('poincare_cp852.tsv') + relations = [relation for relation in PoincareRelations(non_utf8_file, encoding='cp852')] + self.assertEqual(len(relations), 2) + self.assertEqual(relations[0], (u'tímto', u'budeš')) + + utf8_file = datapath('poincare_utf8.tsv') + relations = [relation for relation in PoincareRelations(utf8_file)] + self.assertEqual(len(relations), 2) + self.assertEqual(relations[0], (u'tímto', u'budeš')) + + +class TestPoincareModel(unittest.TestCase): + def setUp(self): + self.data = PoincareRelations(datapath('poincare_hypernyms.tsv')) + self.data_large = PoincareRelations(datapath('poincare_hypernyms_large.tsv')) + + def models_equal(self, model_1, model_2): + self.assertEqual(len(model_1.kv.vocab), len(model_2.kv.vocab)) + self.assertEqual(set(model_1.kv.vocab.keys()), set(model_2.kv.vocab.keys())) + self.assertTrue(np.allclose(model_1.kv.syn0, model_2.kv.syn0)) + + def test_data_counts(self): + """Tests whether data has been loaded correctly and completely.""" + model = PoincareModel(self.data) + self.assertEqual(len(model.all_relations), 5) + self.assertEqual(len(model.node_relations[model.kv.vocab['kangaroo.n.01'].index]), 3) + self.assertEqual(len(model.kv.vocab), 7) + self.assertTrue('mammal.n.01' not in model.node_relations) + + def test_data_counts_with_bytes(self): + """Tests whether input bytes data is loaded correctly and completely.""" + model = PoincareModel([(b'\x80\x01c', b'\x50\x71a'), (b'node.1', b'node.2')]) + self.assertEqual(len(model.all_relations), 2) + self.assertEqual(len(model.node_relations[model.kv.vocab[b'\x80\x01c'].index]), 1) + self.assertEqual(len(model.kv.vocab), 4) + self.assertTrue(b'\x50\x71a' not in model.node_relations) + + def test_persistence(self): + """Tests whether the model is saved and loaded correctly.""" + model = PoincareModel(self.data, burn_in=0, negative=3) + model.train(epochs=1) + model.save(testfile()) + loaded = PoincareModel.load(testfile()) + self.models_equal(model, loaded) + + def test_persistence_separate_file(self): + """Tests whether the model is saved and loaded correctly when the arrays are stored separately.""" + model = PoincareModel(self.data, burn_in=0, negative=3) + model.train(epochs=1) + model.save(testfile(), sep_limit=1) + loaded = PoincareModel.load(testfile()) + self.models_equal(model, loaded) + + def test_invalid_data_raises_error(self): + """Tests that error is raised on invalid input data.""" + with self.assertRaises(ValueError): + PoincareModel([("a", "b", "c")]) + with self.assertRaises(ValueError): + PoincareModel(["a", "b", "c"]) + with self.assertRaises(ValueError): + PoincareModel("ab") + + def test_vector_shape(self): + """Tests whether vectors are initialized with the correct size.""" + model = PoincareModel(self.data, size=20) + self.assertEqual(model.kv.syn0.shape, (7, 20)) + + def test_vector_dtype(self): + """Tests whether vectors have the correct dtype before and after training.""" + model = PoincareModel(self.data_large, dtype=np.float32, burn_in=0, negative=3) + self.assertEqual(model.kv.syn0.dtype, np.float32) + model.train(epochs=1) + self.assertEqual(model.kv.syn0.dtype, np.float32) + + def test_training(self): + """Tests that vectors are different before and after training.""" + model = PoincareModel(self.data_large, burn_in=0, negative=3) + old_vectors = np.copy(model.kv.syn0) + model.train(epochs=2) + self.assertFalse(np.allclose(old_vectors, model.kv.syn0)) + + def test_training_multiple(self): + """Tests that calling train multiple times results in different vectors.""" + model = PoincareModel(self.data_large, burn_in=0, negative=3) + model.train(epochs=2) + old_vectors = np.copy(model.kv.syn0) + + model.train(epochs=1) + self.assertFalse(np.allclose(old_vectors, model.kv.syn0)) + + old_vectors = np.copy(model.kv.syn0) + model.train(epochs=0) + self.assertTrue(np.allclose(old_vectors, model.kv.syn0)) + + def test_gradients_check(self): + """Tests that the model is trained successfully with gradients check enabled.""" + model = PoincareModel(self.data, negative=3) + try: + model.train(epochs=1, batch_size=1, check_gradients_every=1) + except Exception as e: + self.fail('Exception %s raised unexpectedly while training with gradient checking' % repr(e)) + + @unittest.skipIf(not autograd_installed, 'autograd needs to be installed for this test') + def test_wrong_gradients_raises_assertion(self): + """Tests that discrepancy in gradients raises an error.""" + model = PoincareModel(self.data, negative=3) + model._loss_grad = Mock(return_value=np.zeros((2 + model.negative, model.size))) + with self.assertRaises(AssertionError): + model.train(epochs=1, batch_size=1, check_gradients_every=1) + + def test_reproducible(self): + """Tests that vectors are same for two independent models trained with the same seed.""" + model_1 = PoincareModel(self.data_large, seed=1, negative=3, burn_in=1) + model_1.train(epochs=2) + + model_2 = PoincareModel(self.data_large, seed=1, negative=3, burn_in=1) + model_2.train(epochs=2) + self.assertTrue(np.allclose(model_1.kv.syn0, model_2.kv.syn0)) + + def test_burn_in(self): + """Tests that vectors are different after burn-in.""" + model = PoincareModel(self.data, burn_in=1, negative=3) + original_vectors = np.copy(model.kv.syn0) + model.train(epochs=0) + self.assertFalse(np.allclose(model.kv.syn0, original_vectors)) + + def test_burn_in_only_done_once(self): + """Tests that burn-in does not happen when train is called a second time.""" + model = PoincareModel(self.data, negative=3, burn_in=1) + model.train(epochs=0) + original_vectors = np.copy(model.kv.syn0) + model.train(epochs=0) + self.assertTrue(np.allclose(model.kv.syn0, original_vectors)) + + def test_negatives(self): + """Tests that correct number of negatives are sampled.""" + model = PoincareModel(self.data, negative=5) + self.assertEqual(len(model._get_candidate_negatives()), 5) + + def test_error_if_negative_more_than_population(self): + """Tests error is rased if number of negatives to sample is more than remaining nodes.""" + model = PoincareModel(self.data, negative=5) + with self.assertRaises(ValueError): + model.train(epochs=1) + + def test_no_duplicates_and_positives_in_negative_sample(self): + """Tests that no duplicates or positively related nodes are present in negative samples.""" + model = PoincareModel(self.data_large, negative=3) + positive_nodes = model.node_relations[0] # Positive nodes for node 0 + num_samples = 100 # Repeat experiment multiple times + for i in range(num_samples): + negatives = model._sample_negatives(0) + self.assertFalse(positive_nodes & set(negatives)) + self.assertEqual(len(negatives), len(set(negatives))) + + def test_handle_duplicates(self): + """Tests that correct number of negatives are used.""" + vector_updates = np.array([[0.5, 0.5], [0.1, 0.2], [0.3, -0.2]]) + node_indices = [0, 1, 0] + PoincareModel._handle_duplicates(vector_updates, node_indices) + vector_updates_expected = np.array([[0.0, 0.0], [0.1, 0.2], [0.8, 0.3]]) + self.assertTrue((vector_updates == vector_updates_expected).all()) + + @classmethod + def tearDownClass(cls): + try: + os.unlink(testfile()) + except OSError: + pass + + +class TestPoincareKeyedVectors(unittest.TestCase): + def setUp(self): + self.vectors = PoincareKeyedVectors.load_word2vec_format(datapath('poincare_vectors.bin'), binary=True) + + def test_most_similar(self): + """Test most_similar returns expected results.""" + expected = [ + 'canine.n.02', + 'hunting_dog.n.01', + 'carnivore.n.01', + 'placental.n.01', + 'mammal.n.01' + ] + predicted = [result[0] for result in self.vectors.most_similar('dog.n.01', topn=5)] + self.assertEqual(expected, predicted) + + def test_most_similar_topn(self): + """Test most_similar returns correct results when `topn` is specified.""" + self.assertEqual(len(self.vectors.most_similar('dog.n.01', topn=5)), 5) + self.assertEqual(len(self.vectors.most_similar('dog.n.01', topn=10)), 10) + + predicted = self.vectors.most_similar('dog.n.01', topn=None) + self.assertEqual(len(predicted), len(self.vectors.vocab) - 1) + self.assertEqual(predicted[-1][0], 'gallant_fox.n.01') + + def test_most_similar_raises_keyerror(self): + """Test most_similar raises KeyError when input is out of vocab.""" + with self.assertRaises(KeyError): + self.vectors.most_similar('not_in_vocab') + + def test_most_similar_restrict_vocab(self): + """Test most_similar returns handles restrict_vocab correctly.""" + expected = set(self.vectors.index2word[:5]) + predicted = set(result[0] for result in self.vectors.most_similar('dog.n.01', topn=5, restrict_vocab=5)) + self.assertEqual(expected, predicted) + + def test_most_similar_to_given(self): + """Test most_similar_to_given returns correct results.""" + predicted = self.vectors.most_similar_to_given('dog.n.01', ['carnivore.n.01', 'placental.n.01', 'mammal.n.01']) + self.assertEqual(predicted, 'carnivore.n.01') + + def test_most_similar_with_vector_input(self): + """Test most_similar returns expected results with an input vector instead of an input word.""" + expected = [ + 'dog.n.01', + 'canine.n.02', + 'hunting_dog.n.01', + 'carnivore.n.01', + 'placental.n.01', + ] + input_vector = self.vectors['dog.n.01'] + predicted = [result[0] for result in self.vectors.most_similar([input_vector], topn=5)] + self.assertEqual(expected, predicted) + + def test_distance(self): + """Test that distance returns expected values.""" + self.assertTrue(np.allclose(self.vectors.distance('dog.n.01', 'mammal.n.01'), 4.5278745)) + self.assertEqual(self.vectors.distance('dog.n.01', 'dog.n.01'), 0) + + def test_distances(self): + """Test that distances between one word and multiple other words have expected values.""" + distances = self.vectors.distances('dog.n.01', ['mammal.n.01', 'dog.n.01']) + self.assertTrue(np.allclose(distances, [4.5278745, 0])) + + distances = self.vectors.distances('dog.n.01') + self.assertEqual(len(distances), len(self.vectors.vocab)) + self.assertTrue(np.allclose(distances[-1], 10.04756)) + + def test_distances_with_vector_input(self): + """Test that distances between input vector and a list of words have expected values.""" + input_vector = self.vectors['dog.n.01'] + distances = self.vectors.distances(input_vector, ['mammal.n.01', 'dog.n.01']) + self.assertTrue(np.allclose(distances, [4.5278745, 0])) + + distances = self.vectors.distances(input_vector) + self.assertEqual(len(distances), len(self.vectors.vocab)) + self.assertTrue(np.allclose(distances[-1], 10.04756)) + + def test_poincare_distances_batch(self): + """Test that poincare_distance_batch returns correct distances.""" + vector_1 = self.vectors['dog.n.01'] + vectors_2 = self.vectors[['mammal.n.01', 'dog.n.01']] + distances = self.vectors.vector_distance_batch(vector_1, vectors_2) + self.assertTrue(np.allclose(distances, [4.5278745, 0])) + + def test_poincare_distance(self): + """Test that poincare_distance returns correct distance between two input vectors.""" + vector_1 = self.vectors['dog.n.01'] + vector_2 = self.vectors['mammal.n.01'] + + distance = self.vectors.vector_distance(vector_1, vector_2) + self.assertTrue(np.allclose(distance, 4.5278745)) + + distance = self.vectors.vector_distance(vector_1, vector_1) + self.assertTrue(np.allclose(distance, 0)) + + def test_closest_child(self): + """Test closest_child returns expected value and returns None for lowest node in hierarchy.""" + self.assertEqual(self.vectors.closest_child('dog.n.01'), 'terrier.n.01') + self.assertEqual(self.vectors.closest_child('harbor_porpoise.n.01'), None) + + def test_closest_parent(self): + """Test closest_parent returns expected value and returns None for highest node in hierarchy.""" + self.assertEqual(self.vectors.closest_parent('dog.n.01'), 'canine.n.02') + self.assertEqual(self.vectors.closest_parent('mammal.n.01'), None) + + def test_ancestors(self): + """Test ancestors returns expected list and returns empty list for highest node in hierarchy.""" + expected = ['canine.n.02', 'carnivore.n.01', 'placental.n.01', 'mammal.n.01'] + self.assertEqual(self.vectors.ancestors('dog.n.01'), expected) + expected = [] + self.assertEqual(self.vectors.ancestors('mammal.n.01'), expected) + + def test_descendants(self): + """Test descendants returns expected list and returns empty list for lowest node in hierarchy.""" + expected = [ + 'terrier.n.01', 'sporting_dog.n.01', 'spaniel.n.01', 'water_spaniel.n.01', 'irish_water_spaniel.n.01' + ] + self.assertEqual(self.vectors.descendants('dog.n.01'), expected) + self.assertEqual(self.vectors.descendants('dog.n.01', max_depth=3), expected[:3]) + + def test_similarity(self): + """Test similarity returns expected value for two nodes, and for identical nodes.""" + self.assertTrue(np.allclose(self.vectors.similarity('dog.n.01', 'dog.n.01'), 1)) + self.assertTrue(np.allclose(self.vectors.similarity('dog.n.01', 'mammal.n.01'), 0.180901358)) + + def norm(self): + """Test norm returns expected value.""" + self.assertTrue(np.allclose(self.vectors.norm('dog.n.01'), 0.97757602)) + self.assertTrue(np.allclose(self.vectors.norm('mammal.n.01'), 0.03914723)) + + def test_difference_in_hierarchy(self): + """Test difference_in_hierarchy returns expected value for two nodes, and for identical nodes.""" + self.assertTrue(np.allclose(self.vectors.difference_in_hierarchy('dog.n.01', 'dog.n.01'), 0)) + self.assertTrue(np.allclose(self.vectors.difference_in_hierarchy('mammal.n.01', 'dog.n.01'), 0.9384287)) + self.assertTrue(np.allclose(self.vectors.difference_in_hierarchy('dog.n.01', 'mammal.n.01'), -0.9384287)) + + def test_words_closer_than(self): + """Test words_closer_than returns expected value for distinct and identical nodes.""" + self.assertEqual(self.vectors.words_closer_than('dog.n.01', 'dog.n.01'), []) + expected = set(['canine.n.02', 'hunting_dog.n.01']) + self.assertEqual(set(self.vectors.words_closer_than('dog.n.01', 'carnivore.n.01')), expected) + + def test_rank(self): + """Test rank returns expected value for distinct and identical nodes.""" + self.assertEqual(self.vectors.rank('dog.n.01', 'dog.n.01'), 1) + self.assertEqual(self.vectors.rank('dog.n.01', 'carnivore.n.01'), 3) + + +if __name__ == '__main__': + logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG) + unittest.main() diff --git a/gensim/test/test_summarization.py b/gensim/test/test_summarization.py index 9b628f04d5..45c0bce8ee 100644 --- a/gensim/test/test_summarization.py +++ b/gensim/test/test_summarization.py @@ -18,7 +18,7 @@ from gensim import utils from gensim.corpora import Dictionary -from gensim.summarization import summarize, summarize_corpus, keywords +from gensim.summarization import summarize, summarize_corpus, keywords, mz_keywords class TestSummarizationTest(unittest.TestCase): @@ -148,6 +148,25 @@ def test_keywords_runs(self): kwds_lst = keywords(text, split=True) self.assertTrue(len(kwds_lst)) + def test_mz_keywords(self): + pre_path = os.path.join(os.path.dirname(__file__), 'test_data') + + with utils.smart_open(os.path.join(pre_path, "head500.noblanks.cor")) as f: + text = utils.to_unicode(f.read()) + text = u' '.join(text.split()[:10240]) + kwds = mz_keywords(text) + self.assertTrue(kwds.startswith('autism')) + self.assertTrue(kwds.endswith('uk')) + self.assertTrue(len(kwds.splitlines())) + + kwds_lst = mz_keywords(text, split=True) + self.assertTrue(len(kwds_lst)) + # Automatic thresholding selects words with n_blocks / n_blocks+1 + # bits of entropy. For this text, n_blocks=10 + n_blocks = 10. + kwds_auto = mz_keywords(text, scores=True, weighted=False, threshold='auto') + self.assertTrue(kwds_auto[-1][1] > (n_blocks / (n_blocks + 1.))) + def test_low_distinct_words_corpus_summarization_is_empty_list(self): text = self._get_text_from_test_data("testlowdistinctwords.txt") diff --git a/gensim/test/utils.py b/gensim/test/utils.py index 89fae9226e..358133c321 100644 --- a/gensim/test/utils.py +++ b/gensim/test/utils.py @@ -5,8 +5,10 @@ """ Common utils for tests """ +import contextlib import tempfile import os +import shutil from gensim.corpora import Dictionary @@ -27,6 +29,22 @@ def get_tmpfile(suffix): return os.path.join(tempfile.gettempdir(), suffix) +@contextlib.contextmanager +def temporary_file(name=""): + """create a temporary directory and return a path to "name" in that directory + + At the end of the context, the directory is removed. + + The function doesn't create the file. + """ + # note : when dropping python2.7 support, we can use tempfile.TemporaryDirectory + tmp = tempfile.mkdtemp() + try: + yield os.path.join(tmp, name) + finally: + shutil.rmtree(tmp, ignore_errors=True) + + # set up vars used in testing ("Deerwester" from the web tutorial) common_texts = [ ['human', 'interface', 'computer'], diff --git a/gensim/utils.py b/gensim/utils.py index 39bc87df9a..1a499a6d61 100644 --- a/gensim/utils.py +++ b/gensim/utils.py @@ -29,11 +29,12 @@ import random import itertools import tempfile -from functools import wraps # for `synchronous` function lock +from functools import wraps import multiprocessing import shutil import sys import subprocess +import inspect import numpy as np import numbers @@ -623,9 +624,9 @@ def get_my_ip(): """ import socket try: - import Pyro4 + from Pyro4.naming import locateNS # we know the nameserver must exist, so use it as our anchor point - ns = Pyro4.naming.locateNS() + ns = locateNS() s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect((ns._pyroUri.host, ns._pyroUri.port)) result, port = s.getsockname() @@ -1280,3 +1281,42 @@ def lazy_flatten(nested_list): yield sub else: yield el + + +def deprecated(reason): + """Decorator which can be used to mark functions as deprecated. It will result in a warning being emitted + when the function is used, base code from https://stackoverflow.com/a/40301488/8001386. + + """ + if isinstance(reason, string_types): + def decorator(func): + fmt = "Call to deprecated `{name}` ({reason})." + + @wraps(func) + def new_func1(*args, **kwargs): + warnings.warn( + fmt.format(name=func.__name__, reason=reason), + category=DeprecationWarning, + stacklevel=2 + ) + return func(*args, **kwargs) + + return new_func1 + return decorator + + elif inspect.isclass(reason) or inspect.isfunction(reason): + func = reason + fmt = "Call to deprecated `{name}`." + + @wraps(func) + def new_func2(*args, **kwargs): + warnings.warn( + fmt.format(name=func.__name__), + category=DeprecationWarning, + stacklevel=2 + ) + return func(*args, **kwargs) + return new_func2 + + else: + raise TypeError(repr(type(reason))) diff --git a/gensim/viz/__init__.py b/gensim/viz/__init__.py new file mode 100644 index 0000000000..3f968b01e4 --- /dev/null +++ b/gensim/viz/__init__.py @@ -0,0 +1,3 @@ +""" +This package contains functions to visualize different models from `gensim.models`. +""" diff --git a/gensim/viz/poincare.py b/gensim/viz/poincare.py new file mode 100644 index 0000000000..41ea3d2eab --- /dev/null +++ b/gensim/viz/poincare.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Author: Jayant Jain +# Copyright (C) 2017 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + + +""" +Utilities for creating 2-D visualizations of Poincare models and Poincare distance heatmaps. + +""" + +import logging + +from collections import Counter +import numpy as np +import plotly.graph_objs as go + +from gensim.models.poincare import PoincareKeyedVectors + + +logger = logging.getLogger(__name__) + + +def poincare_2d_visualization(model, tree, figure_title, num_nodes=50, show_node_labels=()): + """Create a 2-d plot of the nodes and edges of a 2-d poincare embedding. + + Parameters + ---------- + model : :class:`~gensim.models.poincare.PoincareModel` + The model to visualize, model size must be 2. + tree : set + Set of tuples containing the direct edges present in the original dataset. + figure_title : str + Title of the plotted figure. + num_nodes : int or None + Number of nodes for which edges are to be plotted. + If `None`, all edges are plotted. + Helpful to limit this in case the data is too large to avoid a messy plot. + show_node_labels : iterable + Iterable of nodes for which to show labels by default. + + Returns + ------- + :class:`plotly.graph_objs.Figure` + Plotly figure that contains plot. + + """ + vectors = model.kv.syn0 + if vectors.shape[1] != 2: + raise ValueError('Can only plot 2-D vectors') + + node_labels = model.kv.index2word + nodes_x = list(vectors[:, 0]) + nodes_y = list(vectors[:, 1]) + nodes = go.Scatter( + x=nodes_x, y=nodes_y, + mode='markers', + marker=dict(color='rgb(30, 100, 200)'), + text=node_labels, + textposition='bottom' + ) + + nodes_x, nodes_y, node_labels = [], [], [] + for node in show_node_labels: + vector = model.kv[node] + nodes_x.append(vector[0]) + nodes_y.append(vector[1]) + node_labels.append(node) + nodes_with_labels = go.Scatter( + x=nodes_x, y=nodes_y, + mode='markers+text', + marker=dict(color='rgb(200, 100, 200)'), + text=node_labels, + textposition='bottom' + ) + + node_out_degrees = Counter(hypernym_pair[1] for hypernym_pair in tree) + if num_nodes is None: + chosen_nodes = list(node_out_degrees.keys()) + else: + chosen_nodes = list(sorted(node_out_degrees.keys(), key=lambda k: -node_out_degrees[k]))[:num_nodes] + + edges_x = [] + edges_y = [] + for u, v in tree: + if not(u in chosen_nodes or v in chosen_nodes): + continue + vector_u = model.kv[u] + vector_v = model.kv[v] + edges_x += [vector_u[0], vector_v[0], None] + edges_y += [vector_u[1], vector_v[1], None] + edges = go.Scatter( + x=edges_x, y=edges_y, mode="line", hoverinfo=False, + line=dict(color='rgb(50,50,50)', width=1)) + + layout = go.Layout( + title=figure_title, showlegend=False, hovermode='closest', width=800, height=800) + return go.Figure(data=[edges, nodes, nodes_with_labels], layout=layout) + + +def poincare_distance_heatmap(origin_point, x_range=(-1.0, 1.0), y_range=(-1.0, 1.0), num_points=100): + """Create a heatmap of Poincare distances from `origin_point` for each point (x, y), + where x and y lie in `x_range` and `y_range` respectively, with `num_points` points chosen uniformly in both ranges. + + Parameters + ---------- + origin_point : tuple (int, int) + (x, y) from which distances are to be measured and plotted. + x_range : tuple (int, int) + Range for x-axis from which to choose `num_points` points. + y_range : tuple (int, int) + Range for y-axis from which to choose `num_points` points. + num_points : int + Number of points to choose from `x_range` and `y_range`. + + Notes + ----- + Points outside the unit circle are ignored, since the Poincare distance is defined + only for points inside the circle boundaries (exclusive of the boundary). + + Returns + ------- + :class:`plotly.graph_objs.Figure` + Plotly figure that contains plot + + """ + epsilon = 1e-8 # Can't choose (-1.0, -1.0) or (1.0, 1.0), distance undefined + x_range, y_range = list(x_range), list(y_range) + if x_range[0] == -1.0 and y_range[0] == -1.0: + x_range[0] += epsilon + y_range[0] += epsilon + if x_range[0] == 1.0 and y_range[0] == 1.0: + x_range[0] -= epsilon + y_range[0] -= epsilon + + x_axis_values = np.linspace(x_range[0], x_range[1], num=num_points) + y_axis_values = np.linspace(x_range[0], x_range[1], num=num_points) + x, y = np.meshgrid(x_axis_values, y_axis_values) + all_points = np.dstack((x, y)).swapaxes(1, 2).swapaxes(0, 1).reshape(2, num_points ** 2).T + norms = np.linalg.norm(all_points, axis=1) + all_points = all_points[norms < 1] + + origin_point = np.array(origin_point) + all_distances = PoincareKeyedVectors.poincare_dists(origin_point, all_points) + + distances = go.Scatter( + x=all_points[:, 0], + y=all_points[:, 1], + mode='markers', + marker=dict( + size='9', + color=all_distances, + colorscale='Viridis', + showscale=True, + colorbar=go.ColorBar( + title='Poincare Distance' + ), + ), + text=[ + 'Distance from (%.2f, %.2f): %.2f' % (origin_point[0], origin_point[1], d) + for d in all_distances], + name='', # To avoid the default 'trace 0' + ) + + origin = go.Scatter( + x=[origin_point[0]], + y=[origin_point[1]], + name='Distance from (%.2f, %.2f)' % (origin_point[0], origin_point[1]), + mode='markers+text', + marker=dict( + size='10', + color='rgb(200, 50, 50)' + ) + ) + + layout = go.Layout( + width=900, + height=800, + showlegend=False, + title='Poincare Distances from (%.2f, %.2f)' % (origin_point[0], origin_point[1]), + hovermode='closest', + ) + + return go.Figure(data=[distances, origin], layout=layout) diff --git a/setup.cfg b/setup.cfg index b5f8a99afa..282192a170 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,8 +1,4 @@ [wheelhouse_uploader] artifact_indexes= - # OSX wheels built by travis (only for specific tags): - # https://github.com/MacPython/scikit-learn-wheels - http://wheels.scipy.org - # Windows wheels buit by: - # https://ci.appveyor.com/project/piskvorky/gensim - http://17a25141cb7f75c18ee4-676a79255544e7711e0dd8bccdcdd1cb.r23.cf2.rackcdn.com + # all wheels builded in gensim-wheels repo: https://github.com/MacPython/gensim-wheels + http://b153eb958f4da6029aca-3f9dff7fe564350f10153d8c7bfc5ab6.r54.cf2.rackcdn.com/index.html diff --git a/setup.py b/setup.py index 503cbac485..a5d8fa6bdc 100644 --- a/setup.py +++ b/setup.py @@ -196,7 +196,7 @@ def finalize_options(self): @inproceedings{rehurek_lrec, title = {{Software Framework for Topic Modelling with Large Corpora}}, - author = {Radim {\v R}eh{\r u}{\v r}ek and Petr Sojka}, + author = {Radim {\\v R}eh{\\r u}{\\v r}ek and Petr Sojka}, booktitle = {{Proceedings of the LREC 2010 Workshop on New Challenges for NLP Frameworks}}, pages = {45--50}, @@ -229,6 +229,7 @@ def finalize_options(self): win_testenv = [ 'pytest', 'pytest-rerunfailures', + 'mock', 'cython', 'pyemd', 'testfixtures', @@ -244,7 +245,7 @@ def finalize_options(self): setup( name='gensim', - version='3.1.0', + version='3.2.0', description='Python framework for fast Vector Space Modelling', long_description=LONG_DESCRIPTION, @@ -254,6 +255,9 @@ def finalize_options(self): include_dirs=[model_dir]), Extension('gensim.models.doc2vec_inner', sources=['./gensim/models/doc2vec_inner.c'], + include_dirs=[model_dir]), + Extension('gensim.models.fasttext_inner', + sources=['./gensim/models/fasttext_inner.c'], include_dirs=[model_dir]) ], cmdclass=cmdclass, @@ -303,7 +307,7 @@ def finalize_options(self): 'distributed': distributed_env, 'test-win': win_testenv, 'test': linux_testenv, - 'docs': linux_testenv + distributed_env + ['sphinx', 'sphinxcontrib-napoleon'], + 'docs': linux_testenv + distributed_env + ['sphinx', 'sphinxcontrib-napoleon', 'plotly'], }, include_package_data=True, diff --git a/tox.ini b/tox.ini index 6cce66eee3..229692fbee 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] minversion = 2.0 -envlist = {py27,py35,py36}-{win,linux}, flake8, docs, docs-upload, download-wheels, upload-wheels +envlist = {py27,py35,py36}-{win,linux}, flake8, docs, docs-upload, download-wheels, upload-wheels, test-pypi skipsdist = True platform = linux: linux win: win64 @@ -18,7 +18,10 @@ addopts = -rfxEXs --durations=20 --showlocals --rerun 3 [testenv] recreate = True + +; rackcdn host only for windows wheels (numpy, scipy) install_command = pip install --timeout=60 --trusted-host 28daf2247a33ed269873-7b1aad3fab3cc330e1fd9d109892382a.r6.cf2.rackcdn.com --find-links http://28daf2247a33ed269873-7b1aad3fab3cc330e1fd9d109892382a.r6.cf2.rackcdn.com/ {opts} numpy==1.11.3 scipy==0.18.1 {packages} + deps = linux: .[test] win: .[test-win] @@ -76,3 +79,15 @@ commands = deps = wheelhouse_uploader commands = python setup.py register sdist upload + + +[testenv:test-pypi] +deps = wheelhouse_uploader + twine +whitelist_externals = rm + +commands = + rm -rf dist/ + python setup.py sdist + twine upload --repository-url https://test.pypi.org/legacy/ dist/* + ; Go to https://testpypi.python.org/pypi?name=gensim&:action=display and check result From 1d9c13f420af649d0c8fa0834fb3ae20cf1ec432 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 8 Jan 2018 21:06:28 +0500 Subject: [PATCH 03/42] Workaround link bug --- gensim/models/translation_matrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/models/translation_matrix.py b/gensim/models/translation_matrix.py index 1dd7cd6b25..1c6d8a22b3 100644 --- a/gensim/models/translation_matrix.py +++ b/gensim/models/translation_matrix.py @@ -267,7 +267,7 @@ def translate(self, source_words, topn=5, gc=0, sample_num=None, source_lang_vec Number of words than will be returned as translation for each `source_words` gc : int, optional Define translation algorithm, if `gc == 0` - use standard NN retrieval, - otherwise, use globally corrected neighbour retrieval method (as described in [1]_). + otherwise, use globally corrected neighbour retrieval method (as described in [1]). sample_num : int, optional Number of word to sample from the source lexicon, if `gc == 1`, then `sample_num` **must** be provided. source_lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors`, optional From fe6b60e2e078de42ea33ed0040c461ac6f758346 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 8 Jan 2018 21:28:52 +0500 Subject: [PATCH 04/42] Add 'The' --- gensim/models/translation_matrix.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gensim/models/translation_matrix.py b/gensim/models/translation_matrix.py index 1c6d8a22b3..58fbfd5726 100644 --- a/gensim/models/translation_matrix.py +++ b/gensim/models/translation_matrix.py @@ -266,7 +266,8 @@ def translate(self, source_words, topn=5, gc=0, sample_num=None, source_lang_vec topn : int, optional Number of words than will be returned as translation for each `source_words` gc : int, optional - Define translation algorithm, if `gc == 0` - use standard NN retrieval, + Define the translation algorithm, if `gc == 0` - use standard NN + retrieval, otherwise, use globally corrected neighbour retrieval method (as described in [1]). sample_num : int, optional Number of word to sample from the source lexicon, if `gc == 1`, then `sample_num` **must** be provided. From 0b9a135204074882a2cbc211c81de04439785c7e Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 9 Jan 2018 19:51:48 +0500 Subject: [PATCH 05/42] Rearrange modules --- docs/src/apiref.rst | 393 +++++++++++++++++++++++++++------------- docs/src/downloader.rst | 9 - docs/src/matutils.rst | 9 - docs/src/utils.rst | 9 - gensim/utils.py | 4 +- 5 files changed, 271 insertions(+), 153 deletions(-) delete mode 100644 docs/src/downloader.rst delete mode 100644 docs/src/matutils.rst delete mode 100644 docs/src/utils.rst diff --git a/docs/src/apiref.rst b/docs/src/apiref.rst index 5fcdf2aeb9..b8adbe25ab 100644 --- a/docs/src/apiref.rst +++ b/docs/src/apiref.rst @@ -2,68 +2,6 @@ API Reference ============= -Modules: - -.. toctree:: - :maxdepth: 0 - - utils - matutils - downloader - -.. _interfaces_ref: - -:mod:`gensim.interfaces`: Interfaces -==================================== - -.. automodule:: gensim.interfaces - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.interfaces - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - CorpusABC - TransformedCorpus - TransformationABC - SimilarityABC - -.. _corpora_ref: - -:mod:`gensim.corpora`: Corpora -============================== - -.. automodule:: gensim.corpora - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.corpora - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - bleicorpus.BleiCorpus - csvcorpus.CsvCorpus - dictionary.Dictionary - hashdictionary.HashDictionary - indexedcorpus.IndexedCorpus - lowcorpus.LowCorpus - malletcorpus.MalletCorpus - mmcorpus.MmCorpus - sharded_corpus.ShardedCorpus - svmlightcorpus.SvmLightCorpus - textcorpus.TextCorpus - ucicorpus.UciCorpus - wikicorpus.WikiCorpus - .. _models_ref: :mod:`gensim.models`: Models @@ -121,6 +59,82 @@ Wrappers varembed.VarEmbed fasttext.FastText +.. _downloader_ref: + +:mod:`gensim.downloader`: Downloader +==================================== + +.. automodule:: gensim.downloader + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.downloader + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + info + load + +.. _scripts_ref: + +:mod:`gensim.scripts`: Scripts +============================== + +.. automodule:: gensim.scripts + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.scripts + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + glove2word2vec.get_glove_info + glove2word2vec.glove2word2vec + word2vec2tensor.word2vec2tensor + segment_wiki.segment_all_articles + segment_wiki.segment_and_write_all_articles + segment_wiki.extract_page_xmls + segment_wiki.segment + +.. _corpora_ref: + +:mod:`gensim.corpora`: Corpora +============================== + +.. automodule:: gensim.corpora + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.corpora + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + bleicorpus.BleiCorpus + csvcorpus.CsvCorpus + dictionary.Dictionary + hashdictionary.HashDictionary + indexedcorpus.IndexedCorpus + lowcorpus.LowCorpus + malletcorpus.MalletCorpus + mmcorpus.MmCorpus + sharded_corpus.ShardedCorpus + svmlightcorpus.SvmLightCorpus + textcorpus.TextCorpus + ucicorpus.UciCorpus + wikicorpus.WikiCorpus + .. _similarities_ref: :mod:`gensim.similarities`: Similarities @@ -144,6 +158,70 @@ Classes docsim.SparseMatrixSimilarity index.AnnoyIndexer +.. _parsing_ref: + +:mod:`gensim.parsing`: Parsing +============================== + +.. automodule:: gensim.parsing + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + porter.PorterStemmer + +Functions +--------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + preprocessing.remove_stopwords + preprocessing.strip_punctuation + preprocessing.strip_tags + preprocessing.strip_short + preprocessing.strip_numeric + preprocessing.strip_non_alphanum + preprocessing.strip_multiple_whitespaces + preprocessing.split_alphanum + preprocessing.stem_text + preprocessing.preprocess_string + preprocessing.preprocess_documents + preprocessing.read_file + preprocessing.read_files + +.. _summarization_ref: + +:mod:`gensim.summarization`: Summarization +========================================== + +.. automodule:: gensim.summarization + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.summarization + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + summarizer.summarize + summarizer.summarize_corpus + mz_entropy.mz_keywords + bm25.get_bm25_weights + keywords.keywords + .. _sklearn_api_ref: :mod:`gensim.sklearn_api`: Sklearn API @@ -173,6 +251,26 @@ Classes tfidf.TfIdfTransformer w2vmodel.W2VTransformer +.. _viz_ref: + +:mod:`gensim.viz`: Visualization +================================ + +.. automodule:: gensim.viz + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.viz + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + poincare.poincare_2d_visualization + poincare.poincare_distance_heatmap + .. _topic_coherence_ref: :mod:`gensim.topic_coherence`: Topic Coherence @@ -225,111 +323,158 @@ Functions segmentation.s_one_one segmentation.s_one_set -.. _scripts_ref: +.. _interfaces_ref: -:mod:`gensim.scripts`: Scripts -============================== +:mod:`gensim.interfaces`: Interfaces +==================================== -.. automodule:: gensim.scripts +.. automodule:: gensim.interfaces :no-members: :no-inherited-members: -Functions ---------- -.. currentmodule:: gensim.scripts +Classes +------- +.. currentmodule:: gensim.interfaces .. autosummary:: :toctree: generated/ - :template: function.rst + :template: class.rst - glove2word2vec.get_glove_info - glove2word2vec.glove2word2vec - word2vec2tensor.word2vec2tensor - segment_wiki.segment_all_articles - segment_wiki.segment_and_write_all_articles - segment_wiki.extract_page_xmls - segment_wiki.segment + CorpusABC + TransformedCorpus + TransformationABC + SimilarityABC -.. _parsing_ref: +.. _utils_ref: -:mod:`gensim.parsing`: Parsing -============================== +:mod:`gensim.utils`: Utils +========================== -.. automodule:: gensim.parsing +.. automodule:: gensim.utils :no-members: :no-inherited-members: Classes ------- -.. currentmodule:: gensim.parsing +.. currentmodule:: gensim.utils .. autosummary:: :toctree: generated/ :template: class.rst - porter.PorterStemmer + SaveLoad + FakeDict + RepeatCorpusNTimes + ClippedCorpus + SlicedCorpus + InputQueue Functions --------- -.. currentmodule:: gensim.parsing +.. currentmodule:: gensim.utils .. autosummary:: :toctree: generated/ :template: function.rst - preprocessing.remove_stopwords - preprocessing.strip_punctuation - preprocessing.strip_tags - preprocessing.strip_short - preprocessing.strip_numeric - preprocessing.strip_non_alphanum - preprocessing.strip_multiple_whitespaces - preprocessing.split_alphanum - preprocessing.stem_text - preprocessing.preprocess_string - preprocessing.preprocess_documents - preprocessing.read_file - preprocessing.read_files - -.. _summarization_ref: - -:mod:`gensim.summarization`: Summarization -========================================== + get_random_state + synchronous + file_or_filename + deaccent + copytree_hardlink + tokenize + simple_tokenize + simple_preprocess + any2utf8 + any2unicode + call_on_class_only + identity + get_max_id + dict_from_corpus + is_corpus + get_my_ip + safe_unichr + decode_htmlentities + chunkize_serial + chunkize + smart_extension + pickle + unpickle + revdict + deprecated + randfname + upload_chunked + getNS + pyro_daemon + has_pattern + lemmatize + mock_data_row + mock_data + prune_vocab + qsize + keep_vocab_item + check_output + sample_dict + strided_windows + iter_windows + flatten + lazy_flatten + +.. _matutils_ref: + +:mod:`gensim.matutils`: Matutils +================================ -.. automodule:: gensim.summarization +.. automodule:: gensim.matutils :no-members: :no-inherited-members: -Functions ---------- -.. currentmodule:: gensim.summarization +Classes +------- +.. currentmodule:: gensim.matutils .. autosummary:: :toctree: generated/ - :template: function.rst - - summarizer.summarize - summarizer.summarize_corpus - mz_entropy.mz_keywords - bm25.get_bm25_weights - keywords.keywords - -.. _viz_ref: - -:mod:`gensim.viz`: Visualization -================================ + :template: class.rst -.. automodule:: gensim.viz - :no-members: - :no-inherited-members: + Scipy2Corpus + Dense2Corpus + Sparse2Corpus + MmWriter + MmReader Functions --------- -.. currentmodule:: gensim.viz +.. currentmodule:: gensim.matutils .. autosummary:: :toctree: generated/ :template: function.rst - poincare.poincare_2d_visualization - poincare.poincare_distance_heatmap + blas + argsort + corpus2csc + pad + zeros_aligned + ismatrix + any2sparse + scipy2scipy_clipped + scipy2sparse + sparse2full + full2sparse + full2sparse_clipped + corpus2dense + veclen + ret_normalized_vec + ret_log_normalize_vec + unitvec + cossim + isbow + convert_vec + kullback_leibler + jensen_shannon + hellinger + jaccard + jaccard_distance + dirichlet_expectation + qr_destroy diff --git a/docs/src/downloader.rst b/docs/src/downloader.rst deleted file mode 100644 index 901a3748f3..0000000000 --- a/docs/src/downloader.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`downloader` -- Downloader API for gensim -============================================== - -.. automodule:: gensim.downloader - :synopsis: Downloader API for gensim - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/matutils.rst b/docs/src/matutils.rst deleted file mode 100644 index 5cce05526e..0000000000 --- a/docs/src/matutils.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`matutils` -- Math utils -============================== - -.. automodule:: gensim.matutils - :synopsis: Math utils - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/utils.rst b/docs/src/utils.rst deleted file mode 100644 index 8e303efad2..0000000000 --- a/docs/src/utils.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`utils` -- Various utility functions -========================================== - -.. automodule:: gensim.utils - :synopsis: Various utility functions - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/gensim/utils.py b/gensim/utils.py index 3f35824fed..ed43240c4e 100644 --- a/gensim/utils.py +++ b/gensim/utils.py @@ -1513,7 +1513,7 @@ def pyro_daemon(name, obj, random_suffix=False, ip=None, port=None, ns_conf=None def has_pattern(): - """Check that `pattern` [5]_ package already installed. + """Check that `pattern` [5] package already installed. Returns ------- @@ -1534,7 +1534,7 @@ def has_pattern(): def lemmatize(content, allowed_tags=re.compile(r'(NN|VB|JJ|RB)'), light=False, stopwords=frozenset(), min_length=2, max_length=15): - """Use the English lemmatizer from `pattern` [5]_ to extract UTF8-encoded tokens in + """Use the English lemmatizer from `pattern` [5] to extract UTF8-encoded tokens in their base form=lemma, e.g. "are, is, being" -> "be" etc. This is a smarter version of stemming, taking word context into account. From 8fa1691ea7d35ef30ad86ff3a2680610bae2e982 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 23 Jan 2018 16:27:33 +0500 Subject: [PATCH 06/42] Remove redundant "This package..." --- gensim/__init__.py | 3 +-- gensim/corpora/__init__.py | 2 +- gensim/models/__init__.py | 3 +-- gensim/models/tfidfmodel.py | 4 ++-- gensim/models/wrappers/__init__.py | 2 +- gensim/parsing/__init__.py | 4 +++- gensim/similarities/__init__.py | 2 +- gensim/test/__init__.py | 2 +- gensim/topic_coherence/__init__.py | 3 +-- gensim/viz/__init__.py | 2 +- 10 files changed, 13 insertions(+), 14 deletions(-) diff --git a/gensim/__init__.py b/gensim/__init__.py index 0d96b46da0..748261618d 100644 --- a/gensim/__init__.py +++ b/gensim/__init__.py @@ -1,6 +1,5 @@ """ -This package contains interfaces and functionality to compute pair-wise document -similarities within a corpus of documents. +Computation of pair-wise document similarities over a corpus of documents. """ from gensim import parsing, matutils, interfaces, corpora, models, similarities, summarization, utils # noqa:F401 diff --git a/gensim/corpora/__init__.py b/gensim/corpora/__init__.py index 0d51a9b903..36e496c8e3 100644 --- a/gensim/corpora/__init__.py +++ b/gensim/corpora/__init__.py @@ -1,5 +1,5 @@ """ -This package contains implementations of various streaming corpus I/O format. +Various streaming corpora I/O formats. """ # bring corpus classes directly into package namespace, to save some typing diff --git a/gensim/models/__init__.py b/gensim/models/__init__.py index 88e0abf28d..7345b7af69 100644 --- a/gensim/models/__init__.py +++ b/gensim/models/__init__.py @@ -1,6 +1,5 @@ """ -This package contains algorithms for extracting document representations from their raw -bag-of-word counts. +Extraction of documents representations from their raw bag-of-word counts. """ # bring model classes directly into package namespace, to save some typing diff --git a/gensim/models/tfidfmodel.py b/gensim/models/tfidfmodel.py index a61e993333..96eb140a11 100644 --- a/gensim/models/tfidfmodel.py +++ b/gensim/models/tfidfmodel.py @@ -27,7 +27,7 @@ def resolve_weights(smartirs): Information Retrieval System, a mnemonic scheme for denoting tf-idf weighting variants in the vector space model. The mnemonic for representing a combination of weights takes the form ddd, where the letters represents the term weighting of the document vector. - for more information visit [1]_. + for more information visit [1]. Returns ------- @@ -272,7 +272,7 @@ def __init__(self, corpus=None, id2word=None, dictionary=None, wlocal=utils.iden * `n` - none, * `c` - cosine. - For more information visit [1]_. + For more information visit [1]. """ diff --git a/gensim/models/wrappers/__init__.py b/gensim/models/wrappers/__init__.py index 9cd14ea8e7..8a5250acd3 100644 --- a/gensim/models/wrappers/__init__.py +++ b/gensim/models/wrappers/__init__.py @@ -1,5 +1,5 @@ """ -This package contains wrappers for other topic modeling programs. +Wrappers for other topic modeling programs. """ from .ldamallet import LdaMallet # noqa:F401 diff --git a/gensim/parsing/__init__.py b/gensim/parsing/__init__.py index 5bbf84239e..07db2b09b9 100644 --- a/gensim/parsing/__init__.py +++ b/gensim/parsing/__init__.py @@ -1,4 +1,6 @@ -"""This package contains functions to preprocess raw text""" +""" +Raw text preprocessing. +""" from .porter import PorterStemmer # noqa:F401 from .preprocessing import (remove_stopwords, strip_punctuation, strip_punctuation2, # noqa:F401 diff --git a/gensim/similarities/__init__.py b/gensim/similarities/__init__.py index 48915d89c9..60aba16939 100644 --- a/gensim/similarities/__init__.py +++ b/gensim/similarities/__init__.py @@ -1,5 +1,5 @@ """ -This package contains implementations of pairwise similarity queries. +Pairwise similarity queries. """ # bring classes directly into package namespace, to save some typing diff --git a/gensim/test/__init__.py b/gensim/test/__init__.py index 0ab71d7206..588efd3c56 100644 --- a/gensim/test/__init__.py +++ b/gensim/test/__init__.py @@ -1,3 +1,3 @@ """ -This package contains automated code tests for all other gensim packages. +Automated code tests for gensim packages. """ diff --git a/gensim/topic_coherence/__init__.py b/gensim/topic_coherence/__init__.py index 82a7b92f2e..f06bea6e3d 100644 --- a/gensim/topic_coherence/__init__.py +++ b/gensim/topic_coherence/__init__.py @@ -1,4 +1,3 @@ """ -This package contains implementation of the individual components of -the topic coherence pipeline. +Individual components of the topic coherence pipeline. """ diff --git a/gensim/viz/__init__.py b/gensim/viz/__init__.py index 3f968b01e4..66425c3693 100644 --- a/gensim/viz/__init__.py +++ b/gensim/viz/__init__.py @@ -1,3 +1,3 @@ """ -This package contains functions to visualize different models from `gensim.models`. +Visualization for different `gensim.models`. """ From 74dcb42cf2641c2f2e96f38b90c7aeed7593b17b Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 6 Feb 2018 19:03:51 +0300 Subject: [PATCH 07/42] Move docs/src/* -> docs/* --- .gitignore | 6 +- docs/{src => }/Makefile | 7 +- docs/{src => }/_templates/class.rst | 0 docs/{src => }/_templates/function.rst | 0 docs/{src => }/about.rst | 0 docs/{src => }/apiref.rst | 104 +-- docs/{src => }/changes_080.rst | 0 docs/{src => }/conf.py | 12 + docs/{src => }/dist_lda.rst | 0 docs/{src => }/dist_lsi.rst | 0 docs/{src => }/distributed.rst | 0 docs/{src => }/gensim_theme/theme.conf | 0 docs/{src => }/indextoc.rst | 0 docs/{src => }/install.rst | 0 docs/{src => }/intro.rst | 0 docs/{src => }/simserver.rst | 0 docs/src/_static/css/anythingslider.css | 291 ------- docs/src/_static/css/jquery.qtip.min.css | 1 - docs/src/_static/css/style.css | 787 ------------------ docs/src/_static/favicon.ico | Bin 1150 -> 0 bytes docs/src/_static/images/arrows.png | Bin 3088 -> 0 bytes docs/src/_static/images/bg.png | Bin 9986 -> 0 bytes docs/src/_static/images/bullets.png | Bin 3156 -> 0 bytes docs/src/_static/images/checker.png | Bin 4738 -> 0 bytes docs/src/_static/images/default.png | Bin 15403 -> 0 bytes docs/src/_static/images/direct-install.png | Bin 18131 -> 0 bytes docs/src/_static/images/download.png | Bin 37697 -> 0 bytes docs/src/_static/images/favicon.ico | Bin 1150 -> 0 bytes .../_static/images/features/converters.png | Bin 6784 -> 0 bytes .../features/efficient_implementations.png | Bin 5491 -> 0 bytes .../src/_static/images/features/free_lgpl.png | Bin 4347 -> 0 bytes .../images/features/memory_independence.png | Bin 7477 -> 0 bytes .../images/features/platform_independence.png | Bin 4952 -> 0 bytes docs/src/_static/images/features/robust.png | Bin 7212 -> 0 bytes .../images/features/similarity_queries.png | Bin 4194 -> 0 bytes docs/src/_static/images/features/support.png | Bin 7439 -> 0 bytes .../images/forkme_left_white_ffffff.png | Bin 6727 -> 0 bytes docs/src/_static/images/gensim-footer.png | Bin 7242 -> 0 bytes docs/src/_static/images/gensim.png | Bin 25785 -> 0 bytes docs/src/_static/images/gensim_code.png | Bin 53822 -> 0 bytes docs/src/_static/images/gensim_compact.png | Bin 18280 -> 0 bytes docs/src/_static/images/get-started.png | Bin 26520 -> 0 bytes docs/src/_static/images/googlegroups.png | Bin 5513 -> 0 bytes docs/src/_static/images/loading.gif | Bin 1737 -> 0 bytes docs/src/_static/images/logo-gensim.png | Bin 23359 -> 0 bytes .../_static/images/logo-gensim_compact.png | Bin 12430 -> 0 bytes docs/src/_static/images/menubutton.png | Bin 3084 -> 0 bytes .../_static/images/references/logo_dtu.gif | Bin 8843 -> 0 bytes .../images/references/logo_dynadmic.png | Bin 14396 -> 0 bytes .../_static/images/references/logo_eudml.png | Bin 9669 -> 0 bytes .../_static/images/references/logo_ghent.png | Bin 4993 -> 0 bytes .../_static/images/references/logo_ibcn.png | Bin 38342 -> 0 bytes .../_static/images/references/logo_issuu.jpeg | Bin 3946 -> 0 bytes .../_static/images/references/logo_roistr.png | Bin 71879 -> 0 bytes .../references/logo_sportsauthority.png | Bin 4211 -> 0 bytes .../images/references/logo_tailwind.png | Bin 55890 -> 0 bytes docs/src/_static/images/tagline.png | Bin 4820 -> 0 bytes docs/src/_static/images/tagline_compact.png | Bin 5183 -> 0 bytes docs/src/_static/images/twitterbird.png | Bin 3758 -> 0 bytes docs/src/_static/images/ukazka.png | Bin 17894 -> 0 bytes docs/src/_static/images/ukazka2.png | Bin 17463 -> 0 bytes docs/src/_static/js/jquery-1.9.1.min.js | 5 - .../_static/js/jquery-migrate-1.1.1.min.js | 3 - .../_static/js/jquery.anythingslider.min.js | 6 - docs/src/_static/js/jquery.qtip.min.js | 2 - docs/src/_templates/indexcontent.html | 179 ---- docs/src/gensim_theme/domainindex.html | 56 -- docs/src/gensim_theme/genindex.html | 77 -- docs/src/gensim_theme/layout.html | 226 ----- docs/src/gensim_theme/page.html | 4 - docs/src/gensim_theme/search.html | 56 -- docs/src/gensim_theme/static/doctools.js | 247 ------ docs/src/gensim_theme/static/jquery.js | 4 - docs/src/gensim_theme/static/underscore.js | 23 - docs/{src => }/support.rst | 0 docs/{src => }/tut1.rst | 0 docs/{src => }/tut2.rst | 0 docs/{src => }/tut3.rst | 0 docs/{src => }/tutorial.rst | 0 docs/{src => }/wiki.rst | 0 examples/README.txt | 9 + setup.py | 6 +- tox.ini | 4 +- 83 files changed, 81 insertions(+), 2034 deletions(-) rename docs/{src => }/Makefile (95%) rename docs/{src => }/_templates/class.rst (100%) rename docs/{src => }/_templates/function.rst (100%) rename docs/{src => }/about.rst (100%) rename docs/{src => }/apiref.rst (85%) rename docs/{src => }/changes_080.rst (100%) rename docs/{src => }/conf.py (96%) rename docs/{src => }/dist_lda.rst (100%) rename docs/{src => }/dist_lsi.rst (100%) rename docs/{src => }/distributed.rst (100%) rename docs/{src => }/gensim_theme/theme.conf (100%) rename docs/{src => }/indextoc.rst (100%) rename docs/{src => }/install.rst (100%) rename docs/{src => }/intro.rst (100%) rename docs/{src => }/simserver.rst (100%) delete mode 100644 docs/src/_static/css/anythingslider.css delete mode 100644 docs/src/_static/css/jquery.qtip.min.css delete mode 100644 docs/src/_static/css/style.css delete mode 100644 docs/src/_static/favicon.ico delete mode 100644 docs/src/_static/images/arrows.png delete mode 100644 docs/src/_static/images/bg.png delete mode 100644 docs/src/_static/images/bullets.png delete mode 100644 docs/src/_static/images/checker.png delete mode 100644 docs/src/_static/images/default.png delete mode 100644 docs/src/_static/images/direct-install.png delete mode 100644 docs/src/_static/images/download.png delete mode 100644 docs/src/_static/images/favicon.ico delete mode 100644 docs/src/_static/images/features/converters.png delete mode 100644 docs/src/_static/images/features/efficient_implementations.png delete mode 100644 docs/src/_static/images/features/free_lgpl.png delete mode 100644 docs/src/_static/images/features/memory_independence.png delete mode 100644 docs/src/_static/images/features/platform_independence.png delete mode 100644 docs/src/_static/images/features/robust.png delete mode 100644 docs/src/_static/images/features/similarity_queries.png delete mode 100644 docs/src/_static/images/features/support.png delete mode 100644 docs/src/_static/images/forkme_left_white_ffffff.png delete mode 100644 docs/src/_static/images/gensim-footer.png delete mode 100644 docs/src/_static/images/gensim.png delete mode 100644 docs/src/_static/images/gensim_code.png delete mode 100644 docs/src/_static/images/gensim_compact.png delete mode 100644 docs/src/_static/images/get-started.png delete mode 100644 docs/src/_static/images/googlegroups.png delete mode 100644 docs/src/_static/images/loading.gif delete mode 100644 docs/src/_static/images/logo-gensim.png delete mode 100644 docs/src/_static/images/logo-gensim_compact.png delete mode 100644 docs/src/_static/images/menubutton.png delete mode 100644 docs/src/_static/images/references/logo_dtu.gif delete mode 100644 docs/src/_static/images/references/logo_dynadmic.png delete mode 100644 docs/src/_static/images/references/logo_eudml.png delete mode 100644 docs/src/_static/images/references/logo_ghent.png delete mode 100644 docs/src/_static/images/references/logo_ibcn.png delete mode 100644 docs/src/_static/images/references/logo_issuu.jpeg delete mode 100644 docs/src/_static/images/references/logo_roistr.png delete mode 100644 docs/src/_static/images/references/logo_sportsauthority.png delete mode 100644 docs/src/_static/images/references/logo_tailwind.png delete mode 100644 docs/src/_static/images/tagline.png delete mode 100644 docs/src/_static/images/tagline_compact.png delete mode 100644 docs/src/_static/images/twitterbird.png delete mode 100644 docs/src/_static/images/ukazka.png delete mode 100644 docs/src/_static/images/ukazka2.png delete mode 100644 docs/src/_static/js/jquery-1.9.1.min.js delete mode 100644 docs/src/_static/js/jquery-migrate-1.1.1.min.js delete mode 100644 docs/src/_static/js/jquery.anythingslider.min.js delete mode 100644 docs/src/_static/js/jquery.qtip.min.js delete mode 100644 docs/src/_templates/indexcontent.html delete mode 100644 docs/src/gensim_theme/domainindex.html delete mode 100644 docs/src/gensim_theme/genindex.html delete mode 100644 docs/src/gensim_theme/layout.html delete mode 100644 docs/src/gensim_theme/page.html delete mode 100644 docs/src/gensim_theme/search.html delete mode 100644 docs/src/gensim_theme/static/doctools.js delete mode 100644 docs/src/gensim_theme/static/jquery.js delete mode 100644 docs/src/gensim_theme/static/underscore.js rename docs/{src => }/support.rst (100%) rename docs/{src => }/tut1.rst (100%) rename docs/{src => }/tut2.rst (100%) rename docs/{src => }/tut3.rst (100%) rename docs/{src => }/tutorial.rst (100%) rename docs/{src => }/wiki.rst (100%) create mode 100644 examples/README.txt diff --git a/.gitignore b/.gitignore index d5bc1b203b..015dac262b 100644 --- a/.gitignore +++ b/.gitignore @@ -48,9 +48,9 @@ Thumbs.db .settings/ .eggs cython_debug -docs/src/_build/ -docs/src/generated/ -docs/src/auto_examples/ +docs/_build/ +docs/generated/ +docs/auto_examples/ docs/_static docs/notebooks/.ipynb_checkpoints dedan_gensim.tmproj diff --git a/docs/src/Makefile b/docs/Makefile similarity index 95% rename from docs/src/Makefile rename to docs/Makefile index 30144caf21..3c758f1b61 100644 --- a/docs/src/Makefile +++ b/docs/Makefile @@ -6,6 +6,7 @@ # You can set these variables from the command line. SPHINXOPTS = -W +# SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build @@ -33,13 +34,15 @@ help: clean: -rm -rf $(BUILDDIR)/* -rm -rf generated/* + -rm -rf modules/generated/ + -rm -rf auto_examples/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html rm -r $(BUILDDIR)/html/_sources - cp -r $(BUILDDIR)/html/* ../ + cp -r $(BUILDDIR)/html/* . @echo - @echo "Build finished. The HTML pages are in ../" + @echo "Build finished. The HTML pages are in /docs" upload: scp -r _build/html/* rr:public_html/gensim/ diff --git a/docs/src/_templates/class.rst b/docs/_templates/class.rst similarity index 100% rename from docs/src/_templates/class.rst rename to docs/_templates/class.rst diff --git a/docs/src/_templates/function.rst b/docs/_templates/function.rst similarity index 100% rename from docs/src/_templates/function.rst rename to docs/_templates/function.rst diff --git a/docs/src/about.rst b/docs/about.rst similarity index 100% rename from docs/src/about.rst rename to docs/about.rst diff --git a/docs/src/apiref.rst b/docs/apiref.rst similarity index 85% rename from docs/src/apiref.rst rename to docs/apiref.rst index b8adbe25ab..f9959d3aed 100644 --- a/docs/src/apiref.rst +++ b/docs/apiref.rst @@ -28,10 +28,6 @@ Models logentropy_model.LogEntropyModel normmodel.NormModel translation_matrix.TranslationMatrix - lsi_dispatcher.Dispatcher - lsi_worker.Worker - lda_dispatcher.Dispatcher - lda_worker.Worker atmodel.AuthorTopicModel word2vec.Word2Vec keyedvectors.KeyedVectors @@ -44,6 +40,29 @@ Models basemodel.BaseTopicModel callbacks.Callback +Workers +------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + lsi_worker.Worker + lda_worker.Worker + + +Dispatchers +----------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + lsi_dispatcher.Dispatcher + lda_dispatcher.Dispatcher + Wrappers -------- .. currentmodule:: gensim.models.wrappers @@ -113,7 +132,7 @@ Functions :no-members: :no-inherited-members: -Classes +Corpora ------- .. currentmodule:: gensim.corpora @@ -123,8 +142,6 @@ Classes bleicorpus.BleiCorpus csvcorpus.CsvCorpus - dictionary.Dictionary - hashdictionary.HashDictionary indexedcorpus.IndexedCorpus lowcorpus.LowCorpus malletcorpus.MalletCorpus @@ -135,6 +152,17 @@ Classes ucicorpus.UciCorpus wikicorpus.WikiCorpus +Dictionaries +------------ +.. currentmodule:: gensim.corpora + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + dictionary.Dictionary + hashdictionary.HashDictionary + .. _similarities_ref: :mod:`gensim.similarities`: Similarities @@ -208,6 +236,16 @@ Functions :no-members: :no-inherited-members: +Classes +------- +.. currentmodule:: gensim.summarization + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + bm25.BM25 + Functions --------- .. currentmodule:: gensim.summarization @@ -271,58 +309,6 @@ Functions poincare.poincare_2d_visualization poincare.poincare_distance_heatmap -.. _topic_coherence_ref: - -:mod:`gensim.topic_coherence`: Topic Coherence -============================================== - -.. automodule:: gensim.topic_coherence - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.topic_coherence - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - indirect_confirmation_measure.ContextVectorComputer - text_analysis.BaseAnalyzer - text_analysis.UsesDictionary - text_analysis.InvertedIndexBased - text_analysis.CorpusAccumulator - text_analysis.WindowedTextsAnalyzer - text_analysis.InvertedIndexAccumulator - text_analysis.WordOccurrenceAccumulator - text_analysis.PatchedWordOccurrenceAccumulator - text_analysis.ParallelWordOccurrenceAccumulator - text_analysis.AccumulatingWorker - text_analysis.WordVectorsAccumulator - -Functions ---------- -.. currentmodule:: gensim.topic_coherence - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - aggregation.arithmetic_mean - direct_confirmation_measure.log_conditional_probability - direct_confirmation_measure.aggregate_segment_sims - direct_confirmation_measure.log_ratio_measure - indirect_confirmation_measure.word2vec_similarity - indirect_confirmation_measure.cosine_similarity - probability_estimation.p_boolean_document - probability_estimation.p_boolean_sliding_window - probability_estimation.p_word2vec - probability_estimation.unique_ids_from_segments - segmentation.s_one_pre - segmentation.s_one_one - segmentation.s_one_set - .. _interfaces_ref: :mod:`gensim.interfaces`: Interfaces diff --git a/docs/src/changes_080.rst b/docs/changes_080.rst similarity index 100% rename from docs/src/changes_080.rst rename to docs/changes_080.rst diff --git a/docs/src/conf.py b/docs/conf.py similarity index 96% rename from docs/src/conf.py rename to docs/conf.py index 335e0161e4..6398750581 100644 --- a/docs/src/conf.py +++ b/docs/conf.py @@ -19,6 +19,8 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.append(os.path.abspath('.')) +import sphinx_gallery + # -- General configuration ----------------------------------------------------- html_theme = 'gensim_theme' @@ -29,6 +31,7 @@ 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.napoleon', + 'sphinx_gallery.gen_gallery', 'sphinx.ext.imgmath' ] autoclass_content = "both" @@ -44,6 +47,15 @@ # The encoding of source files. # source_encoding = 'utf-8' +# Generate the plots for the gallery +plot_gallery = True + +sphinx_gallery_conf = { + 'doc_module': 'gensim', + 'backreferences_dir': os.path.join('modules', 'generated'), + 'reference_url': {'gensim': None} +} + # The master toctree document. master_doc = 'indextoc' diff --git a/docs/src/dist_lda.rst b/docs/dist_lda.rst similarity index 100% rename from docs/src/dist_lda.rst rename to docs/dist_lda.rst diff --git a/docs/src/dist_lsi.rst b/docs/dist_lsi.rst similarity index 100% rename from docs/src/dist_lsi.rst rename to docs/dist_lsi.rst diff --git a/docs/src/distributed.rst b/docs/distributed.rst similarity index 100% rename from docs/src/distributed.rst rename to docs/distributed.rst diff --git a/docs/src/gensim_theme/theme.conf b/docs/gensim_theme/theme.conf similarity index 100% rename from docs/src/gensim_theme/theme.conf rename to docs/gensim_theme/theme.conf diff --git a/docs/src/indextoc.rst b/docs/indextoc.rst similarity index 100% rename from docs/src/indextoc.rst rename to docs/indextoc.rst diff --git a/docs/src/install.rst b/docs/install.rst similarity index 100% rename from docs/src/install.rst rename to docs/install.rst diff --git a/docs/src/intro.rst b/docs/intro.rst similarity index 100% rename from docs/src/intro.rst rename to docs/intro.rst diff --git a/docs/src/simserver.rst b/docs/simserver.rst similarity index 100% rename from docs/src/simserver.rst rename to docs/simserver.rst diff --git a/docs/src/_static/css/anythingslider.css b/docs/src/_static/css/anythingslider.css deleted file mode 100644 index 25ad8c53e6..0000000000 --- a/docs/src/_static/css/anythingslider.css +++ /dev/null @@ -1,291 +0,0 @@ -/* - AnythingSlider v1.8+ Default theme - By Chris Coyier: http://css-tricks.com - with major improvements by Doug Neiner: http://pixelgraphics.us/ - based on work by Remy Sharp: http://jqueryfordesigners.com/ -*/ - -/***************************** - SET DEFAULT DIMENSIONS HERE - *****************************/ -/* change the ID & dimensions to match your slider */ -#slider { - width: 700px; - height: 390px; - list-style: none; - /* Prevent FOUC (see FAQ page) and keep things readable if javascript is disabled */ - overflow-y: auto; - overflow-x: hidden; -} - -/****************** - SET STYLING HERE - ****************** - ================================= - Default state (no keyboard focus) - ==================================*/ -/* Overall Wrapper */ -.anythingSlider-default { - margin: 0 auto; - /* 45px right & left padding for the arrows, 28px @ bottom for navigation */ - padding: 0 45px 28px 45px; -} -/* slider window - top & bottom borders, default state */ -.anythingSlider-default .anythingWindow { - border-top: 3px solid #777; - border-bottom: 3px solid #777; -} -/* Navigation buttons + start/stop button, default state */ -.anythingSlider-default .anythingControls a { - /* top shadow */ - background: #777 url(../images/default.png) center -288px repeat-x; - color: #000; - border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - -webkit-border-radius: 0 0 5px 5px; -} -/* Make sure navigation text is visible */ -.anythingSlider-default .anythingControls a span { - visibility: visible; -} -/* Navigation current button, default state */ -.anythingSlider-default .anythingControls a.cur { - background: #888; - color: #000; -} - -/* start-stop button, stopped, default state */ -.anythingSlider-default .anythingControls a.start-stop { - background-color: #040; - color: #ddd; -} -/* start-stop button, playing, default state */ -.anythingSlider-default .anythingControls a.start-stop.playing { - background-color: #800; -} - -/* start-stop button, default hovered text color (when visible) */ -/* hide nav/start-stop background image shadow on hover - makes the button appear to come forward */ -.anythingSlider-default .anythingControls a.start-stop:hover, -.anythingSlider-default .anythingControls a.start-stop.hover, -.anythingSlider-default .anythingControls a.start-stop .anythingControls ul a:hover { - background-image: none; - color: #ddd; -} - -/* - ================================= - Active State (has keyboard focus) - ================================= -*/ -/* slider window - top & bottom borders, active state */ -.anythingSlider-default.activeSlider .anythingWindow { - border-color: #7C9127; -} -/* Navigation buttons, active state */ -.anythingSlider-default.activeSlider .anythingControls a { - /* background image = top shadow */ - background-color: #7C9127; -} -/* Navigation current & hovered button, active state */ -.anythingSlider-default.activeSlider .anythingControls a.cur, -.anythingSlider-default.activeSlider .anythingControls a:hover { - /* background image removed */ - background: #7C9127; -} - -/* start-stop button, stopped, active state */ -.anythingSlider-default.activeSlider .anythingControls a.start-stop { - background-color: #080; - color: #fff; -} -/* start-stop button, playing, active state */ -.anythingSlider-default.activeSlider .anythingControls a.start-stop.playing { - background-color: #d00; - color: #fff; -} -/* start-stop button, active slider hovered text color (when visible) */ -.anythingSlider-default.activeSlider .start-stop:hover, -.anythingSlider-default.activeSlider .start-stop.hover { - color: #fff; -} - -/************************ - NAVIGATION POSITIONING - ************************/ -/* Navigation Arrows */ -.anythingSlider-default .arrow { - top: 50%; - position: absolute; - display: block; -} - -.anythingSlider-default .arrow a { - display: block; - width: 45px; - height: 140px; - margin: -70px 0 0 0; /* half height of image */ - text-align: center; - outline: 0; - background: url(../images/default.png) no-repeat; -} - -/* back arrow */ -.anythingSlider-default .back { left: 0; } -.anythingSlider-default .back a { background-position: left top; } -.anythingSlider-default .back a:hover, -.anythingSlider-default .back a.hover { background-position: left -140px; } -/* forward arrow */ -.anythingSlider-default .forward { right: 0; } -.anythingSlider-default .forward a { background-position: right top; } -.anythingSlider-default .forward a:hover, -.anythingSlider-default .forward a.hover { background-position: right -140px; } - -/* Navigation Links */ -.anythingSlider-default .anythingControls { outline: 0; display: none; } -.anythingSlider-default .anythingControls ul { margin: 0; padding: 0; float: left; } -.anythingSlider-default .anythingControls ul li { display: inline; } -.anythingSlider-default .anythingControls ul a { - font: 11px/18px Georgia, Serif; - display: inline-block; - text-decoration: none; - padding: 2px 8px; - height: 18px; - margin: 0 5px 0 0; - text-align: center; - outline: 0; -} - -/* navigationSize window */ -.anythingSlider-default .anythingControls .anythingNavWindow { - overflow: hidden; - float: left; -} - -/* Autoplay Start/Stop button */ -.anythingSlider-default .anythingControls .start-stop { - padding: 2px 5px; - width: 40px; - text-align: center; - text-decoration: none; - float: right; - z-index: 100; - outline: 0; -} - -/*********************** - IE8 AND OLDER STYLING - ***********************/ - -/* Navigation Arrows */ -.as-oldie .anythingSlider-default .arrow { - top: 30%; -} -.as-oldie .anythingSlider-default .arrow a { - margin: 0; -} - -/* margin between nav buttons just looks better */ -.as-oldie .anythingSlider-default .anythingControls li { - margin-left: 3px; -} - -/* When using the navigationSize option, the side margins need to be zero - None of the navigation panels look good in IE7 now =( */ -.as-oldie .anythingSlider-default .anythingControls a { - margin: 0; -} -.as-oldie .anythingSlider-default .anythingNavWindow { - margin: 0 2px; -} -.as-oldie .anythingSlider-default .anythingNavWindow li { - padding: 3px 0 0 0; -} - -/*********************** - COMMON SLIDER STYLING - ***********************/ -/* Overall Wrapper */ -.anythingSlider { - display: block; - overflow: visible !important; - position: relative; -} -/* anythingSlider viewport window */ -.anythingSlider .anythingWindow { - overflow: hidden; - position: relative; - width: 100%; - height: 100%; -} -/* anythingSlider base (original element) */ -.anythingSlider .anythingBase { - background: transparent; - list-style: none; - position: absolute; - overflow: visible !important; - top: 0; - left: 0; - margin: 0; - padding: 0; -} - -/* Navigation arrow text; indent moved to span inside "a", for IE7; - apparently, a negative text-indent on an "a" link moves the link as well as the text */ -.anythingSlider .arrow span { - display: block; - visibility: hidden; -} -/* disabled arrows, hide or reduce opacity: opacity: .5; filter: alpha(opacity=50); */ -.anythingSlider .arrow.disabled { - display: none; -} -/* all panels inside the slider; horizontal mode */ -.anythingSlider .panel { - background: transparent; - display: block; - overflow: hidden; - float: left; - padding: 0; - margin: 0; -} -/* vertical mode */ -.anythingSlider .vertical .panel { - float: none; -} -/* fade mode */ -.anythingSlider .fade .panel { - float: none; - position: absolute; - top: 0; - left: 0; - z-index: 0; -} -/* fade mode active page - visible & on top */ -.anythingSlider .fade .activePage { - z-index: 1; -} - -/*********************** - RTL STYLING - ***********************/ -/* slider autoplay right-to-left, reverse order of nav links to look better */ -.anythingSlider.rtl .anythingWindow { - direction: ltr; - unicode-bidi: bidi-override; -} -.anythingSlider.rtl .anythingControls ul { float: left; } /* move nav link group to left */ -.anythingSlider.rtl .anythingControls ul a { float: right; } /* reverse order of nav links */ -.anythingSlider.rtl .start-stop { /* float: right; */ } /* move start/stop button - in case you want to switch sides */ - -/* probably not necessary, but added just in case */ -.anythingSlider, -.anythingSlider .anythingWindow, -.anythingSlider .anythingControls ul a, -.anythingSlider .arrow a, -.anythingSlider .start-stop { - transition-duration: 0; - -o-transition-duration: 0; - -moz-transition-duration: 0; - -webkit-transition-duration: 0; -} diff --git a/docs/src/_static/css/jquery.qtip.min.css b/docs/src/_static/css/jquery.qtip.min.css deleted file mode 100644 index 9c454f3050..0000000000 --- a/docs/src/_static/css/jquery.qtip.min.css +++ /dev/null @@ -1 +0,0 @@ -/*! qtip2 v2.0.0 | http://craigsworks.com/projects/qtip2/ | Licensed MIT, GPL */.qtip,.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;cursor:pointer;outline:medium none;border-width:1px;border-style:solid;border-color:transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-titlebar .ui-icon,.qtip-icon .ui-icon{display:block;text-indent:-1000em;direction:ltr;vertical-align:middle}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;text-align:center;text-indent:0;font:normal bold 10px/13px Tahoma,sans-serif;color:inherit;background:transparent none no-repeat -100em -100em}.qtip-focus{}.qtip-hover{}.qtip-default{border-width:1px;border-style:solid;border-color:#F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111}/*! Light tooltip style */.qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1}/*! Dark tooltip style */.qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030}/*! Cream tooltip style */.qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0}/*! Red tooltip style */.qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon{border-color:#D95252}.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252}/*! Green tooltip style */.qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0}/*! Blue tooltip style */.qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-rounded,.qtip-tipsy,.qtip-bootstrap{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border-width:0;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,black));background-image:-webkit-linear-gradient(top,#4A4A4A 0,black 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,black 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,black 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,black 100%)}.qtip-youtube .qtip-titlebar{background-color:#4A4A4A;background-color:rgba(0,0,0,0)}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323)"}.qtip-jtools .qtip-titlebar,.qtip-jtools .qtip-content{background:transparent;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px black}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:transparent}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml{position:absolute;color:#123456;background:transparent;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:-10000em;top:-10000em}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important} \ No newline at end of file diff --git a/docs/src/_static/css/style.css b/docs/src/_static/css/style.css deleted file mode 100644 index e52a94e001..0000000000 --- a/docs/src/_static/css/style.css +++ /dev/null @@ -1,787 +0,0 @@ -a,a img { - text-decoration:none; - border:0; -} - -html, -body { - margin:0; - padding:0; - height:100%; - background: #fafafa url('../images/bg.png') top center repeat; - color:#333333; - font-family:arial; - font-size: 14px; -} - -p { - color:#333333; - font-family:arial; - font-size: 14px; -} - -ul li { - color:#333333; - font-family:arial; - font-size: 14px; -} - -.obsah ul li a,.obsah a{ - color:#006699; - font-weight:bold; - text-decoration:underline; -} - -.obsah ul li a:hover,.obsah a:hover{ - color:#000; - font-weight:bold; -} - -.h1gensim { - margin: 0; - padding: 0; - display: block; -} - -.h2gensim { - margin:0; - padding:0; - font-size:36px; - color:#fff; - text-shadow: 3px 3px 3px #404040; -} - -h1 { /* headings are already in a special banner... ignore the h1 generated by sphinx */ - display: none; -} - -.h3gensim { - margin:0; - padding:0 0 40px 0; - font-size:32px; - color:#333333; -} - -h4 { - margin:0; - padding:0 0 40px 0; - font-size:22px; - color:#333333; -} - -h5{ - margin:0; - padding:0 0 40px 0; - font-size:18px; - color:#333333; -} - -.qtip-content { - font-size: 12px; - line-height: 14px; -} - -/* LOGO, NADPIS A DOWNLOAD */ - -#topwrap{ - width:980px; - margin: 0 auto; -} - -#top{ - height:225px; -} -#left{ - float:left; - padding-top: 83px; - width: 120px; -} -#middleright{ - float:right; -} -#middle{ - float:left; - width:490px; - padding-top: 83px; -} -#right{ - float:right; - width:351px; - padding-top: 83px; -} -#design_tagline{ - padding-left:85px; -} -#design_install{ - float:right; - padding-right: 12px; - background: url('../images/direct-install.png') top center no-repeat; - width: 244px; - height: 52px; -} -#command{ - color:#485420; - font-size:14px; - font-family:arial; - font-weight:bold; - padding: 27px 0 0 72px; -} -.space10{ - height:10px; -} - -/* MENU, MODRY PRUH */ - -#menu{ - width: 974px; -} -#indentation{ - padding-top:90px; - float:right; - position:relative; - text-align:left; -} - -.menubuttons{ - list-style: none; - position:relative; -} - -.menubuttons li { - float:left; - position:relative; -} - -li.menubuttonblue a { - float:left; - display: inline-block; - width: 124px; - height: 39px; - background: url('../images/menubutton.png') top; - font-size:16px; - font-weight:bold; - color:#ffffff; - font-family:arial; - text-align:center; - line-height: 39px; -} - -li.menubutton a { - float:left; - display: inline-block; - width: 124px; - height: 39px; - background: url('../images/menubutton.png') bottom; - font-size:16px; - font-weight:bold; - color:#222222; - font-family:arial; - text-align:center; - line-height: 39px; -} - -.menubutton a:hover{ - background-position: 0 0; -} - -#design_banner{ - width: 100%; - height: 274px; - clear:both; - background: #006699; -} - -#thinbanner { - width: 100%; - height: 99px; - clear:both; - background: #006699; -} - -#bodythinbanner{ - width: 980px; - height: 99px; - padding-top:25px; - margin: 0 auto; -} - -#bodybanner{ - width: 980px; - height: 274px; - padding-top: 30px; - margin: 0 auto; -} - -.leftbanner{ - float:left; - width: 418px; - border-radius: 10px; - overflow: hidden; -} - -.leftbanner img { - border-radius: 10px; - overflow: hidden; - width: 418px; - margin: 10px 0 0 0; -} - -.rightbanner{ - float:right; -} - -ul.description li{ - list-style: none; - background: url('../images/checker.png') no-repeat left top; - font-size: 14px; - padding: 6px 0 0 45px; - height: 44px; - font-weight: bold; - color: #ffffff; -} - -ul.description{ - padding-left: 6px; - padding-top: 9px; -} - - -/* HLAVNI OBSAH, FEATURES, REFERENCE, GET STARTED */ - - -.podklad { - margin-top:80px; - margin-left:auto; - margin-right:auto; - width: 974px; - background: #ffffff; - -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#cccccc')"; - filter: progid:DXImageTransform.Microsoft.Shadow(Strength=9, Direction=135, Color='#cccccc'); - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - -khtml-border-radius: 5px; - border-radius: 5px; - -moz-box-shadow: 3px 2px 3px 4px #cccccc; - -webkit-box-shadow: 3px 2px 3px 4px #cccccc; - box-shadow: 3px 2px 3px 4px #cccccc; -} - -.podkladwrapper { - padding: 30px 0 20px 27px; -} - -.more-info { - font-size: 12px; - font-weight: bold; - color: #777777; - margin: 6px 2px; -} - -.obsah{ - margin-top:0; - margin-left:auto; - margin-right:auto; - width: 974px; - background: #ffffff; -} - -.obsahwrapper{ - padding:30px 27px 20px 27px; -} - -.feature{ - padding-top: 5px; - vertical-align: 100%; - font-size: 15px; - padding-left: 15px; - font-weight: bold; - color: #333333; -} - -.half1{ - width:520px; - float:left; -} - -.half2{ - width:400px; - float:right; -} -.lefthalf1{ - float:left; - display:block; -} -.lefthalf2{ - float:right; - display:block; -} -.quarter1{ - width:260px; - height: 90px; -} -.quarter2{ - width:250px; - height: 90px; -} -.quarter3{ - width:195px; - height: 90px; -} -.quarter4{ - width:160px; - height: 90px; -} -.clearit{ - clear:both; -} -.center{ - margin:0 auto; - text-align:center; -} - -ul.reference{ - list-style-type: none; - padding:0; - margin:0; -} - -.testimonial-author { - font-style: normal; - font-weight: normal; - display: block; -} - -ul.reference li { - display: inline-block; - padding-right: 20px; - font-size: 13px; - font-style: italic; - width: 281px; - height: 196px; - padding-top: 10px; - padding-bottom: 10px; - padding-left: 15px; - color: #333333; - font-weight: bold; - font-style: italic; -} - -.reference1 { - display: inline-block; - width: 247px; -/* background: url('../images/references/logo_ghent.png') top center no-repeat; -*/ background: url('../images/references/logo_ibcn.png') top center no-repeat; - background-size: 60%; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference2 { - width: 247px; - background: url('../images/references/logo_roistr.png') top center no-repeat; - padding-top: 100px; - padding-bottom: 24px; - background-position-y: 15px; -} - -.reference3 { - display: inline-block; - width: 247px; - background: url('../images/references/logo_sportsauthority.png') top center no-repeat; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference4 { - display: inline-block; - width: 247px; - background: url('../images/references/logo_dynadmic.png') top center no-repeat; - background-size: 45%; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference4 { - display: inline-block; - width: 247px; - background: url('../images/references/logo_dynadmic.png') top center no-repeat; - background-size: 45%; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference5 { - display: inline-block; - width: 247px; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference6 { - display: inline-block; - width: 247px; - background: url('../images/references/logo_eudml.png') top center no-repeat; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference7 { - display: inline-block; - width: 247px; - background: url('../images/references/logo_dtu.gif') top center no-repeat; - background-size: 25%; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference8 { - display: inline-block; - width: 247px; - background: url('../images/references/logo_issuu.jpeg') top center no-repeat; - padding-top: 100px; - padding-bottom: 24px; -} - -.reference9 { - display: inline-block; - width: 247px; - background: url('../images/references/logo_tailwind.png') top center no-repeat; - background-size: 95%; - padding-top: 100px; - background-position: 0 -20px; - padding-bottom: 24px; -} - -.getstarted{ - text-align: center; - padding: 30px 0 20px 0; -} - - -/* FOOTER */ - - -#footer{ - margin: 0; - width: 100%; - height: 270px; - clear:both; - background: #072a47; - padding: 0; -} -#footerwrapper{ - width: 980px; - height: 270px; - padding-top:16px; - margin: 0 auto; -} - -#footerleft { -/* width:329px; -*/ float:left; -} - -#footermiddleright { -/* width:640px; -*/ float:right; -} - -#footermiddle { - width:355px; - float:left; - padding: 15px 10px; -} - -#footerright{ - width:285px; - float:right; -} -.smallerlogo{ - width: 44px; - height: 44px; - padding-right: 12px; -} -.copyright{ - font-size:14px; - color:#ffffff; - padding-top: 158px; -} -.navigation{ - list-style-type:none; - padding:0; - margin:0; -} -.navigation li{ - display:inline-block; - padding-right:5px; - font-size:14px; - color:#ffffff; -} -.navigation li a{ - display:inline-block; - font-size:14px; - color:#ffffff; -} - -.tweetodsazeni { - padding-top: 174px; -} - -.tweet { - width: 179px; - height: 39px; - padding-left: 50px; - padding-top: 0px; - font-size: 14px; - color: #ffffff; - background: url('../images/twitterbird.png') top left no-repeat; -} -a.tweet{ - font-size:14px; - color:#ffffff; -} -.footernadpis{ - font-size:34px; - color:#ffffff; -} -.googlegroupsodsazeni{ - padding-top:18px; -} - -.googlegroups{ - width: 300px; - height: 39px; - padding-left: 45px; - padding-top: 10px; - font-size: 14px; - color: #ffffff; - background: url('../images/googlegroups.png') top left no-repeat; - display: block; -} - -a.googlegroups{ - font-size:14px; - color:#ffffff; -} - -#design_download { - text-align:right; -} - -#design_install { - float:right; - padding-right: 12px; - background: url('../images/direct-install.png') top center no-repeat; - width: 207px; - height: 44px; -} - -#command { - color:#485420; - font-size:12px; - font-family:arial; - font-weight:bold; - padding: 23px 0 0 64px; -} - -#top1{ - height:148px; -} - -#left1{ - float:left; - padding-top: 53px; - width: 76px; -} - -#middle1{ - float:left; - width:540px; - padding-top: 53px; -} - -#tagline1{ - padding-left:50px; -} - -#indentation1{ - padding-top:10px; - float:right; - position:relative; - text-align:left; -} - -#right1 { - float:right; - width: 351px; - padding-top: 53px; -} - -.consulting-banner { - background-color: #ff2010; - background-color: rgba(255, 32, 16, 0.2); - padding: 1px 10px; - -moz-border-radius: 15px; - border-radius: 15px; - line-height: 0.8em; -} - -/* copied from sphinx themes */ - -a.headerlink { - color: #006699; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -a.headerlink:hover { - background-color: #006699; - color: white; - visibility: visible; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -table.docutils { - border: 0; - border-collapse: collapse; -} - -div.versioninfo { - margin: 1em 0 0 0; - border: 1px solid #ccc; - background-color: #DDEAF0; - padding: 8px; - line-height: 1.3em; - font-size: 0.9em; -} - -.document { - line-height: 150%; -} - -/*table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} -*/ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -div.admonition, div.warning { - font-size: 0.9em; - margin: 1em 0 0 0; - border: 1px solid #86989B; - background-color: #f7f7f7; -} - -div.admonition p, div.warning p { - margin: 0.5em 1em 0.5em 1em; - padding: 0; -} - -div.admonition pre, div.warning pre { - margin: 0.4em 1em 0.4em 1em; -} - -div.admonition p.admonition-title, -div.warning p.admonition-title { - margin: 0; - padding: 0.1em 0 0.1em 0.5em; - color: white; - border-bottom: 1px solid #86989B; - font-weight: bold; - background-color: #AFC1C4; -} - -div.warning { - border: 1px solid #940000; -} - -div.warning p.admonition-title { - background-color: #CF0000; - border-bottom-color: #940000; -} - -div.admonition ul, div.admonition ol, -div.warning ul, div.warning ol { - margin: 0.1em 0.5em 0.5em 3em; - padding: 0; -} - -.first { - margin-top: 0 !important; -} - -pre { - font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.95em; - letter-spacing: 0.015em; - padding: 0.5em; - border: 1px solid #ccc; - background-color: #f8f8f8; - line-height: 120%; - overflow-x: auto; -} - -tt { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -dt:target, -.highlight { - background-color: #fbe54e; -} - -dl.class, dl.function { - border-top: 2px solid #888; -} - -dl.method, dl.attribute { - border-top: 1px solid #aaa; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} diff --git a/docs/src/_static/favicon.ico b/docs/src/_static/favicon.ico deleted file mode 100644 index 3f458e48108791d9a8907b25a93633818ce6a073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 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

v^Xke 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 QW&i*H07*qoM6N<$g1uzaZ2$lO diff --git a/docs/src/_static/images/default.png b/docs/src/_static/images/default.png deleted file mode 100644 index 9fc837c804be06d0d34b55bffd5a43bcfa6e6340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15403 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 L73n%j(~$oGGx=K> diff --git a/docs/src/_static/images/direct-install.png b/docs/src/_static/images/direct-install.png deleted file mode 100644 index 5cfee8efe319cfd07651e020e64bbc0c11de9b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18131 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 diff --git a/docs/src/_static/images/features/free_lgpl.png b/docs/src/_static/images/features/free_lgpl.png deleted file mode 100644 index 0ba6d4cc6bc323820f424d7a30e87f3cc5f42fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4347 zcmVRo000009a7bBm000B7 z000B70m@lZnE(I^PiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000IiNkl8*FkMP~Y=7!Z#2 z#e)SmcEr?!4S~6fEJ$2vI8h-+^A7+3|NorMu?fH+6adi|i%gd)YX}aJ9mL73Tp&9H z#P&C7tdHaF*t&{JLBpGn1L*iL6Dlq|7`So%#uoqp0RR7#(6I_Y02GDcFA1 z2xcahAfm}G{NR!w8O^Zl&MY%k2ThG~Q=9#_R(a7gYq1M{hs^w3EGNGPKC#6yRrY}& z%y7dYW@DU6%XifKiY7Z;3bz%O`NjYv%(2D;6Kq1c%QU7K{Zn=ZA zou~8sde3vt@B0qCOha3bL8D=_HJ8^G5B*gupG}-$GzTX*#ZIko12@4y150RU?ETb? zU?0mk#7na#vRD)=@NtFXVKp4O#a1}({y-EX75QRU(f+(>NENn%@CS45aBtC?K zKPZX;Nujlc8qmUCY@;?xz(OluA-+LCOBL<3F&0_Y<^;y^N)TeP;8e5A?%BIDbI&>V z&&rZXT{+SR+($KERNns!$J8|7GXR{5Z>aUD2yKv%$&@)eb2OW-YFT;(VNufSNSd2xV)&w*9tXBx>(pc+v94Pe;= zH-S;$#&ka~pLp$rVEBg#J5fKr0LQ=q@Mx|}QtWw6LM(522kZra7bVIGFyejkkt}b) zy|fSPD6au)#;ayRa^*KjQ-`mLhP|a#Kj@F%q|TGTlA1fGUNnG#ZqB|PXe@!1b;R|X z_(s~IIdjtL3Az1CQ;LB<*)x0BD55Be|2De>7817DMT0~{h+-)we}c9O8Wj{t3c(;YrrWvOHALIS{!9J+YcNH)_iT(h_@__!`c>|Vn$B0 zF9MtigX@C71Uv*DNpW_x;7?clJuaL6;Knuv>y}z&`lH$CBef?x#Y;_~zJO)F0WMe~ z{Q}-11Dtlvh;CHokoRgjJ&|0G07osEgK;8Sfxagtodni(0ewx6XiQxJFbJFjKFgP1 z0Cns6zS8R$uqt4qi9k>KcBb9@Zr!smiZSRV(ytojU#R7GmIh`ejvE5rD)=Loz?j}& zyZGdPGtm`Kt#SP8_$xO*RQSlt3iWhnaeEmN!MNWb?@zxj5|7~CE&K0vYHEMIA8|%ID5A#&E~DgGm7y+OXa;&Ch?7p z+DDtMWciGz$O*#Gsn*>Qfqifzze`?A6NmNI#Ip=r&YzHHh9CP zeQXac*lKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000tTNklfl^_>LG3?~ z(uxQbrBw@3Q>0STKuRsqszpInEAdDZBsZj~pd=*ZAskHH!~`7TaXj`sJTt!c&VAo| zo_p`L*6-Ip_PN(Hxo*_rAazUYuD#FEIp_ENJ-_SsyGB(3`0tlEa9IQ6D)PIJUuABp zL8p*kEA!1{K<;hCI4;o0t$Jo3F~Xl4%4gR;H*we_CxDlb)C z9E|1ry_a|Rpl|6m-BA}qccE>`5(j{f%Bb>8H{oo$|K)>x!CCVeVC~iXe)3ln z8dUX-QTa#P{pyDor;>$ZhjZpTj_HP_ky@+;L%jrph*Ada_6q6V?D@0TxBYuI`hHcF z-xt;Yq{?6XwF58)tTm^4qv{ujh5LyUGiiG7@dhVmQrfA-T7!=e6(kyrsR1Y;3eFm4 zTaMY5R(8YUg_YvHOFPw1Mv;$N%fB{;>whf(M3gGTzh4GvOCFxP5vakWhU{Kn`XmO=iG_ws%b zKJpy_U;t|jiL>c;zx)r|1N$>arc)leyTjp5$~Y*A7*Yog2ntgT!*tUCP(;J10yPlS zfKd#FR%V!PfU}M&D#xZ0j!Zc|bD_6*b#46Hs`BPe?*6GY#+z4bfpHnyrH>!0g8s;f zxs->_c4;J*ow1N77GuCEC;I9S;%`23$QWtErT9hBkW!`+O(eeVoe zVo?lPYRQ}!;o0m8bMSciV~s_B2+Qrqf&aI@R2COgLkyJ z<4^{`KY8pL&#jifH`7Y~?mHehRxQpoi1A<=wRwsO^9DR6eP(Ey};r!_~ zQIviucu_*6)}|;y>cEX!`*{`W*LI8A4W}9qB1BQ5)SuhiMe86RdFAS6Ra@N)_Z)9A z*D^nRV`KR1N-a~Gyu1#$(C5Ckvj1Y9TGqCUpN=B$1 zt}HeFbLC}U#)r=wy&XWenW7W-xo~y+wU?KBznY|uPHs6qo3lO$q|RdP%YrijVvJ6b zB`CF4oz|6HBHZjN3mw=TvL6Gtt}+T`P|BcO+9>fsnC&F|@pHS(w=Lyp@Tph1trVhS8ySVE@P0ZMeFrC`uKCD%5)|yikNXP6{vN2`qF|o?96*otw^?PX6fmbBEt;OCWCwQPqC@^-J5|_u@+bM|GmnZf@Bc1Em4%jDNYn;>PlSG4(OG_scFl6+j4O& zAS#r;w!pp;{GNj9%#@&H&QK`yi@;}}y79A5Us``W3jEkzXKx44X{L+{|GL%f@%I~J zI6dEFaV7@?yQ4rE>tZBoYHmXh|be=g%#iU7T$^f4~Bx!n4&Y9|=KnFUqC0 zF^$}D{>&6EvFsMY_IP6As0=DgD^v1R$rDTFgtH4dr)Cna??k$}Wv1yUgR(OgdPQV? z7&t!N0F+)42~jD1to`3d$|_Dk)W2g?sA42d3`GS#NaLBy8}DA7Zu|=0H*-4x@5S^- z)w@EJ+BHOYVRg**NH{a!;Qo^x&Yy13$sN}2QH471TT@fdciz>anOg2YB0Tj{$(7BD z?QtCgpp3n;){k^^!;6~&)P7$Ep{OPrAq zfGf*8=PDm(V^oZRC_;=vh>Ar~QN~r|+E&3*&y%GVYb>3HhhPw`DeC%sG^h#xE zH`L5?lCyR4r-;JRZpFQe4GJGooutx943t%@frQ$XG)7{q>Bn5#5o?#5y|TP}?f`)E zuUkC%`%hd(qGA(+h@lFKbwZ-xCOpSFLyF>qaH!+>`FAXkr-tA9$`;GLK$chZ!ReVskhKi4ZNbNd4DpjmC?PI+{s8@_a6(Ye|W?DHh3PlDg(``o){vLU zQLNTzP?&BR{>=}aU}qfpm!Db!V`yfMaTRf{20DrJ39VM*gyhXM9hs|RpkLIk7Ng+z z0YoZa1N2@9F(T12(@2Q1P6kC8rVm)aV%**@h9FG04P#$x!-UD{RzZUDp@&ZrMfkZ- zUL&ZXl{vE}MPN>M$@aBPxPw z?ejj=pnMQq!_v+zGHFj3gF6Vont?O5!N+AFcMY0}Vd&$&FOPlXCm%e@orfE|@8eh5 z8U{LzgmI-L&XTxV;HidXy5VSMmdshKsR>>)fpd!u5^H$d9UV~iYsIt6L%wpg&tKl? z(;Ip$icDglm1QK(AR<@;&YHmi01w=~u=1%ty@CaNsPpmB>5S)A$5>Mb^qq?>9(iDn zU;6Y7URWD3(@Ggvk<`^LlO_hE%FZaT-m4~*xjv1F*4(KI!b5j;`S)L3;hQUCW}248 zPQtmxCO>%34DUKO%~Mx*`Qn8wRtKJ<49vC?Bq|~T3U9o7VdVgTt4q7f%{;*kD^O)^ zXUyG4+pPCJYlA?NI{x1Ic|QN_HlMq&Nw<|!`bZK5O&y?&s)(|8h`%)pnVPMN^2FsH z7jKSuW@$+744VVb@^-J@m)t+%(flB^6Bd!iuVx}B|3{2rSt}C z>wZuj#J3;EMQh8pW>Pi>Roy3&I@_oyiK!FF<<$}2xZY!?;dsj(T|V{x^StG*86N$; zOC;9NZluL@C%<@rPN#{z-fAQ-G*VYHNmZV?wu?pi`5!vNFFbsPFFw1?^^GwqLNzJ* zWfkfIbjvEL$hZo(t+EREPzUPG-3mY9K2;U*Rlxgz_YqXcEo|(TeD(4U-*ax3cJ6rB zee-m3M>BUXq|RPHV1W=~=(e)QJI(aI-l(GVPz^m-*GBx#``!S+rPVPXdm`XdM^wS7 z#aV|H#ae?kf}NyW^9mNo928|_vtJP=#Z00SMUhZf-54VhmBc7(n`3_Q;}?1FJ5KRm zK6j0~k9V1B=a2gk!vO$`b8Xsbk zAX>%7J@>gq_*-K@A&AiFq^$QVMuo3ij-teUAT=0?5s^9rNfr3h=e7u5_{3Lk@;$Gg z=gg7r|445+)$iXetqlNuVy2Tn-5*wO7!`pk2sgLJ{Iic-;PofFy!o}WJb2F`zWmKC z8l4O$g0&W74c68i%GkON?43II0EjA%l$Gsb;wp+r&9U|YOa#|hKcmW8&nHlfHD;y~g&*WGO_n)1A?Ba`?KU-Gu-f`(^WtQEM2W$A~ zXRcCKkq`gWeZ1}LEdTs>o?|?yNSn#TeI|mNx?GxDh}?9Zvc6jqLcmNcqEdJ5G-_Ri zrQQ*RD7^8^G#8gggCJ`#K+`mq0;Osac-Sk(m0 zN1~6!5D_1d5Rn+sI1yfyscy#NOoQtiB}e93oIEo1{-O%w^{tZ4opK+5`@jc20KjLy zvCCjo(Hm5>o7oG_n3Gi%9&nR0aZv>ng~YPDHsZIwbb~{klz;IfujS68ZLX{g*w`+R zSobsbd>a*VXBmzIF}$qheT_%m7kbj`#2Ui`cg~_%)H+^w=Fo2(U+Dh3e!pZesu+wa zzW2`7?Y+^reei294=_*?W4iNG`QugT-*|PU&&{n7!@^SqLG~+?aL4H>{=q}1xa(M( zC!gQp51(G=%G!t+1Pr8^gUMN7Kce^e_1^bPrY06htmVjTgE!nc%b1w?&s0B0ae9NkvR>rYS9ZssIedh^oK?!!0M z22VxNTayp{|M~;B2XU6#+XsBsy6s+h{rTno2k$)6{gAVEE=w#~QqUV!jH{ZnM`ysn zjhh1=TON?N6OPO_m}#dRpUv4CRO}34R0dRT5uUo2>I@{#(##y)R>tweEoQnctaDq} z)(5}5J*bxQ%%xG(f7|(h>cK&nwWhs2C@)@Lw~wBh@BHIDb0?a4LbF%U8`cG>oSdq} z8Pq{pM6N9lxCY=XsjC}cMA;vj7|h<_ggmvh8Yxrlj6+jRjvQ*?68F+e8^aIp46Emz zrB(gk3^=~E^w*hA2NsIK*k4@Q8hz;4T=P9A7rSrmwlcPR1^rRQU|dt)(#N`8E_?L3 z{*t{WL1IizH>@GChCFpN@`O$^rQ6DwooX=M%~8ygD?7zUhefz)pcJLAs!>(HJpgA9 z40BXe2co(RB&Cn6?UuiGXe$5u{A}xyZYx{pk1G13iqY6JDg#v&s6st`iIW_^ryOSu z&RVj>kYx$2JfSrazT3)ZTT1L^; zC>lkyh*1vpN8!_8{-WE;|7NS1J~Y$K7m6}aRFR?zRF&W-?GTv&u*Tq=A$5){vox}V zJaaVjggi^uthIkUDB>3fWw;rlcv0DkQC6brx~dkKS1}_K(IP}y3sJ^C%1$bBxbU&C z)_$awC!g)KlQ(qQ`eyIr*%)Qche=GxUVnQsEVQ-Hr-{WmyOpKxd5ryP5Pf=FhSk!? z7((oaC|e=wW{A>@QLFvI!>bvyifR?2Y=Y|%M$ zGDbO-CiZYq#u-&*CcmkxXLi8c3{GS5$JMymvswzH6WlZn}hN|p{Xd)s>2$J~3CeFpwS!4IO zohllmN)!ztO7J0u%EwT8@ud$^`Y1k%it_(_y_$daP!ZJ-MX1~Ngs8?xW1O?bVkYd` z)B`A0jiMT&YK)>)hzGLOU*$5d=EMI#T>pCj_Vi;t9kw+000000NkvXXu0mjfDpZED diff --git a/docs/src/_static/images/features/platform_independence.png b/docs/src/_static/images/features/platform_independence.png deleted file mode 100644 index 914dcf89d2a9ded9272108c3a6e2b086c4010d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4952 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 N002ovPDHLkV1ktaazy|D diff --git a/docs/src/_static/images/forkme_left_white_ffffff.png b/docs/src/_static/images/forkme_left_white_ffffff.png deleted file mode 100644 index 60c60a6342300f3a0674a805d14d0758fae79114..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6727 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 K3k^t*g#QC$jE}_t diff --git a/docs/src/_static/images/gensim-footer.png b/docs/src/_static/images/gensim-footer.png deleted file mode 100644 index 80bfa7a67df3e1f8ed3ed3b58a107a27bbffd4ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7242 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 diff --git a/docs/src/_static/images/gensim.png b/docs/src/_static/images/gensim.png deleted file mode 100644 index 72701bcb4f15cf624e680f842bc0658e96f6e94d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25785 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 diff --git a/docs/src/_static/images/gensim_compact.png b/docs/src/_static/images/gensim_compact.png deleted file mode 100644 index 908968c5515afc1a2aa381b99772a048bf4c301d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18280 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 diff --git a/docs/src/_static/images/get-started.png b/docs/src/_static/images/get-started.png deleted file mode 100644 index 38c7297524192354a2aeed1515be836cc4d31ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26520 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 DP4^T8 diff --git a/docs/src/_static/images/googlegroups.png b/docs/src/_static/images/googlegroups.png deleted file mode 100644 index 719c37c04499b84a8e01d3ce1d9de984aa335c66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5513 zcmV;46?W>0P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000WKNklr4aM_0cB)krrX=uS@ZMq01gfh00Q>* z_6Z~33VTUq?KvNZqC^6lF<&W|5IGW7L!GekwlGW`GlkKy6N zhYT>l=;`UX|Ki1q4vdV944*%LX5iuBfyn%4U|?WmU;qFB0RR6y&_7NBK@`B@-&>ar zATAnWMeP~H!a|RsJ)L?3J1zWs1S>m@UO*FL@Bo~^gvtU5ab#zBJ8$g#j_}E3IK0oo zLaqk43$cR9)@fem|v@@ZM7t1zDE; zA1p)Qk1?`mjUtS~=y~IeGi$clE?HI(zYw(2fQ6R9ErehYZ7eJ_BE}WOq!2p`?feZY z{(~fvC^oW9Of-$fu8>$s7A0D2GVjNooog|yr1WW@hs)(0vo$^a-fe75qDnjn+`QaI z4kRU{LBiLGOBgc(z+M4v{1<&S7-P^P!_3^h^JeS&<_%RvRf$zl)$$F%6fye~Fbq|Q z^_mT4#FVMGpSn)iZpXblcPx9c%gJU3;NJ1Vt z=TTKc2&}DtW^V2gpH^3CHk(XMU14c)fkxvnhek&k8>9e<>-S*SM-Ej(_fZcjo22nX#1+L9i96Az-yy)2gZBN(HGu z_Zlha!fxueO+hS}W>^1!ZcLY@Ex5Fx4OP@yu@?z#84m>*hj z%-d5Rb2OjS`h(g zRNb;+64#Wi@KG8e>V7TCI*qz)K)_jUwktLq6fUO&j%+8V|fK09@aPfncRqa#PCRP4Ph z3`U5`QgF^8BJ_%a>8Gb@x7#$EO+Gw)m<#95V~paQyCjxA5@evDTS zzQ)hjuJhgZS6EtF;^M_Gaju^u67YlD`GAHHS?2^14+GcD&d$>9cCpryrYVXc`0!sq zQ#x0%larHQg%Eb|Kaatf0J5nu~AfE9RHm&v)xO(yA78mRIt%VYFp3%wn}-> zP#VLF36zvXUxzbEdjAd;pgqDEBPk`~EUC?Ufe=Yp;Vmkc|AWVsdeERbPfT34v*~jSJF;1WU8X+X{c#I=Qy0L7Fty|l9dDSXToIHUsh64w?m^FJA z&g9=zJvNW$8X9PBUO^;M!S!ob*|DP|Kb{qa0;RQOYptzPAo@k9wPtvDnBT5nW8tD_ z*tV^mEn7B|OeQHSD`WBEB>;4HcQZCRN=3ASH#WSUH`noT4jeqhKz~2`_kTiVWo5pz z0s%bFLkN+#0Bxo+;Cq5EKnQ{3IJCB|rna`8l`C7=yYFL`E?G)67UR&N1I$Uh#+*3` z!jTA`r;5>)mzQ(q%r{Jok5gV=UK|xmgY-NPrM0x`>g!&;H8fOX+csKjwAO_T7_?U8 zvRTH)#z>`Z)7RIB6oQ2d7tzqrNON-wmoD})JUmPw5GbA(LXaFvl1ilzLZFQGp>N_nKyuM}F$l=`@XvjeM|uI|Bm)w6?CsaU3F% z2)1n#2n4u$=MEhm+i7lTp{lA1V>GVoVp-Os;6Dvmo^sJzOIvA!JBi!cV-{ z{yv?%JGs$6$noRHICu6O*=&aS^XId+t&PTpMhi{s`DG(0N}=r8~gU{i^XCdkH_!#XEK??hY#PmbLYsB zBQ-TOdcEFcGGQ3zcDqxl)R{A9Dk>_n+3b@iPo6$~y0EaYd-v|n&dz8wdiLzuYuB#f zIId7A#>dBxA3q+6M7D3=e*gY`mSv?<>Cn*7!Gi~r$>gb1r$~|%i^V5SoY=pAe_2@> zpU;2v=+TQ8FUH2ka=F~gmoFiN$BrF){rdHrH*e0LKY#i1-Mo2odV2cVvuD?@ zUw`o6!QH!euU@^nxVSh!KY#Duy<4|#J%9fE_U+r-wrx9k^5pF7Y2!hz{_K}ehqtPf73O8@wtkGyFib|)`J9qAU_vSxN)!U+Q3$?~abhem{rh;Yf zPOJW1?#m|PBZ)!HR~tu$H1Sk?EIk|_G;Yi!he6f93Ps{~w+!$1-$w+3U+n~t&M}Ot zdSwI42rFvpj1a?ZjJW9IPwE??&E&#p9=}A*VhFMy6cm+?16Q*P7E0tZ7Ed$$XgM+i z94(M9MQ3b;8w!dQGl;PjLVE4Y?<_P{QXeB^>`CbQFBvD_OT*#R6y9XGLopA~j#=m{7->pd6t>(Yi=3 zP}uo3V`jwsY7W}yU|ZK5z%f|Z?m9z~uy*yuIRu5uFfoVs{~5H(gmaYV0%%rtm$QvL z{~uwK+1e_?@y3>z>U)~d^%(jpL%ul0QBAF>DcN4YPSb$5Y$@O`J^)4H(vAG6fyV-$ zpp9QFT`ozb8GCfYP#22&x;IILw01D;WQQ6$Rd7I-5KT1ikgn+a(|F~;N5`@Dq1(|Cs^MXKy8P08>2 ze(zaIH}OH&tXIpzRp|f=nv{at6&u#2!XbvJ4yIM4%e%g~!%0&*vz<+T(e8jvJ$eoV zB?T~K5as2YK8NWfo<~YPgTv`>IqKsqR5<(dp)cEDK=00n>#89cvunA{%L%$M)}%E- z+Y7LTL0WhsE#TMm`-=Xj>PZ!`)~ z(K&8wwg6)N&3|FkYgh7U3x!zd`r4lqi5ZME;n0{F5#}>?i)rEJH#GeJiA|m+eZ8DO zSU?f>fl#Gzi`dPes#t)+aBX={4?$xdcO&byCid?1(awZqf1}Z}+v{|OO zt|T#wanNsY&NCKu;zG`1RYSh)xbINpDJ|DFE; D?d&fs diff --git a/docs/src/_static/images/logo-gensim.png b/docs/src/_static/images/logo-gensim.png deleted file mode 100644 index 738041df57243dc88f099fd23caa856dc6476b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23359 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 NxGUohq$LUf06T;Do1y>! diff --git a/docs/src/_static/images/references/logo_dynadmic.png b/docs/src/_static/images/references/logo_dynadmic.png deleted file mode 100644 index 6b862b7e1edb7497978cb87d7a484d0527505849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14396 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 diff --git a/docs/src/_static/images/references/logo_eudml.png b/docs/src/_static/images/references/logo_eudml.png deleted file mode 100644 index 7c266bffaa14e176ef7cc2ec910407be2b3acdba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9669 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 Hu0mjf^9*Nd diff --git a/docs/src/_static/images/references/logo_ghent.png b/docs/src/_static/images/references/logo_ghent.png deleted file mode 100644 index 1f0a683b011a95dd6f874d222c7c4f1378a14f1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4993 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 YCJlAc2}1$De~M|UK2)iA@Fe7a0F%}p7ytkO diff --git a/docs/src/_static/images/references/logo_ibcn.png b/docs/src/_static/images/references/logo_ibcn.png deleted file mode 100644 index c7ca533bf3431f5d6161eb4c8037625d41a1c337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38342 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 diff --git a/docs/src/_static/images/references/logo_issuu.jpeg b/docs/src/_static/images/references/logo_issuu.jpeg deleted file mode 100644 index 34955b1e53aaf9cf8207479429dad8fb5c07906e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3946 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 diff --git a/docs/src/_static/images/references/logo_roistr.png b/docs/src/_static/images/references/logo_roistr.png deleted file mode 100644 index 4be07bceee0bd0d88bdc1339d92ebdd8f8ccc259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71879 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 VtLL~oVbK5p002ovPDHLkV1iX;Hh=&C diff --git a/docs/src/_static/images/references/logo_sportsauthority.png b/docs/src/_static/images/references/logo_sportsauthority.png deleted file mode 100644 index 0cbe8ae11218f7812e433f050ca37a89a5a2f150..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4211 zcmV-(5RC7MP)va+(ey1KZyxUjIW{odWDr>E^O zCA_@6|NsB(FC_Q(_w6tw_V)Js($V;$pY`?i@@;7BFC_8t@&5Gm^z`)d^78X;Y3@Kb z{N3H);Nb1;?eI`Z>gwwAZD{$rxc8x-@n2Z+A6F@bX_-^m}*tySVS~ z@BQiN`p3ofh=ll}p!J7@;^N}tGXPb z)YR13+1cLS-tk^o#Kgq@^z;Ap^wQGO*4Ebk^YiHF=-AlU!^6Yp=jYMU(eFSv-QC^h z=H}Pe*TTZW#l^+d)z#$W+hDCQ8AWz=lzs(JTcOinLFRy`Q|pIL;Pb}#~IW!sAo{mp#Bq~N+IDd zOa}N3cZweIrw|eNR`4Ps6y4)LrQk_K$OwGveoE>03cHgGsqf(d-O{(zlSc4^#)vTK zc{xAidtrNg0jh-A5`$3(T0HxQO8Y`p$K6>kmGV4q)OB4a?#^aVs?y66s9#{tn% zFAdY8^u^K9+W2fPTXU(6j(cgu46VBUq~?ygC~Dlr*Ldf~oiTb{7<9PBcQRguHFXkH z7*KX>+jg8q;T&)4ds4Duq)H4nz8R^a0@af*jF~}=inwz^^Wkke+Vp5z$~FX$BGoLR ztiC9GQ8PtkTi;xthNrbJjTr<*$diyd86k>a9}0 z^oeSrmg+9$W{pOoJ}e>W*|qxKh`#h-;#P!F*X1qngj%3E0AG==oMxoQppHYAMpJ*xo$N2`vxhK(*T(y=0TvOL?LR&Y+%H0eP1C8MT<3{d=DLWxj6N&=iC9JwSD zta@rRW1_7EAPM7i{FK;YO+*YSMsd##AdsWEG0Rp#sV$?a0^DWvlE5~IqS+OCnna!p z3l%3@hmNAc%0-(Z#2C@H9n>UtpXY-oL)f`3JPdj_UCR(?d7*h44e2!E5JS;HxX+t0 zh|A@hF$t2^$(9+Y0Ul5ZN7w6n$x5CCb%w_On&7!Xa1Hs=s8w??sv^M` zIYBCITn6m4O!8HYY?|JRaRr)7@l1BbXzvPRZdLMnuII^Y;Sf)$Q=x)h0=z5kJ7c)U zoYoMTadTqL{10&Hs3&-OAZ-Iu><7qy7y=Mi(P1gCZWl(Y zsFg@tsHH|j;`+>4l`>F4b^7{AL~p=#!pS~RS+gk&0f^tmZ2ZX`X&cOn!6`@BD5YC{ z$tf{FlkahULAlbvLjvsSH?x)%La|;@d&)2%5z$(`9we(q<{GbwoVz6es#tM^Fy7)Z zglgvkRI%B&&602pbv`<8=@ANTY-^-do=Y04z`iDr`6Ewhhlrt!v|Qzc zoN3V2w(*dIAp}rnyUaXhu0 z)50vq&j4%2bI@Z0FOc?H^$=TD%Qcd9s z5}g8wie!%>Q4diSk*9gkD+Vo+g`*@m+W0CLINO!Ic7J=4} zjFsM+Ezt&)Oc;K>7~u#~>2vDhLHitc40BI*tlG-EUW$6}gJj>ehOSoD$vt-tt#=tK z2Ng}pC0s{fT`(l+q0BV8AQ{fO4Td{DHq9=eV4vumK{Vyor-UofG+2%%Pg@pzg4u1C z+*X(SWCo*=QnT|H4S8@{sdCGhPkQmq!pdfzleAjMHVhcUTqNBhz#L*`?ea)-cymP5 zI65|Fku7Bu&Vj15KwTiV!V)vysEt^YWVKYga0LuU;9*6?^%8snW(ISqWZw7vTxu{C zfq+*#9L0s9nZa#s3C7Ez76Fr{76Ts!<(Iq)QKnE$d0vu^)ltRsmXjbb2>cAV>a?y9 z(R4v2m&@%H1)IfoB@0QlBx%Am_ALAtAv+`WTBR`d7y3*Geo$hs84;Eqx)+y=xS~ax z;={ryM01c#KTmZ_IfT5hfA((R4`^=_Y-o#Ali~%@MJh z4)V!lfg~2$=mf$zCR$4(6vYJlE(pzpoG$7L8%0^#FPx%P>^qOXQLxY8W6M5$tR)PM zKCl5>+Fn6?lQ?(+VNV^y2zV%d(yH8rk1?My7Gd zd{UlL3dZ*%9C9c&APbygfZh8I99KNe^}Ho1@=@>#q}L;&gRY6~pck_?*u7Uw zv_!TnFU#mVs6+$i>_HTqETteL$hQS&q@Yfz1R~Xz$z{G0);5^R3Bx)dsM>9$#AkWEwj8R?oC_|PbY33@}i+#$vlsZkT zw3CktXzo%R5fRBNSEVZMR}Pog29r0 zxCGyYWT^LZKNO#wPhU}BN2ZR90rp3l=cK#mqO?EGBiOBYMS^- zzRH!dgv#7eI*9W5^iz(O(}}d=G$NIBqD5W6Z37huvh6G`Qr%2)0^qTsgd|_+qK#XB z+FIS^=#T8V;*~lD{EP<~92GC%6t2!yQ8lBw{-=TAD@fwYx?0i>s#J^4h$J>aHY64( z0O73Cbx54FTy09|bmQpHY!F3Dflbc0mpEQ@$p9)Xm7(e|C}CsAmP+uK2r%!|QXcMH zw8Vl^+ApnBB8~D#O##Y44e>E;eI&y{3IB3J_K4~T>v2k3IpKG8WffCES1Uy)y`1yR zuxAwQlk3H%kZ3{cPf|&gJd-{Oxd?kOeXI}yT@kt+&iBZ1tP9K{T#C@L5ptH}#8oDK zjVDry3q&fx@|0}Z|1Wr}ZD(OAr_~w~SI2p)9yr^amKqBnq)q7RtQ7?=8AK>pVq3=+ zz|$oPrRrKW1dt8>hm9YbsVpAD|Ar`?U$)$Oj(nw&)AsKwY5E+X5&0r<`w!J_I{87?Txz&ZrG-} zvVcCg03*2yuu!B7JMOwsDo&ud(jqza=-Ldfs7N>QMMxJG_;)`1&_#u@~9-vf6k%b5T| z{{XVa#P3D_+R_%PeJJ)_jo4h@w|HI{W_t&Y+$_J%f4% z^$hAi3~G0GPptp;%Cn2tx~`l*|F84s&z-yS%{MoG_^zw#>eY@PuU)us>CNHc!-sD# zetY@yi-UuSiMtcn?!J5X`d(+}%gxPO0|Wer?bd*~ymiZb3=C`zY`*O5y!ZIsT^$@Lrd~@Z>xpRO9+PNE74_|!Tog3~! zsJ;CguR1S3y!O*~KQtmdeESgLeRy#&arf@y$ItF{e!RcAsS!b2S$+TN`P1E-lkne7 z`bTZ@X5*c?+TDHr>dxxQty^|AoA*C<-h1|%(I33{fWRLf9=^GB;li~aJFa#y=o?)f z7ruWzFgX`PsNKE8Q|=H{mQruzE(`uqFwvkx!u6EFIx_48xs)i*V_VaDOd?a9gA-KVeaynny?esu*F zaUY@Id;R$F-2;S;3O@wcmo8p@z4?5uzqhAjsJjOku<>-I^VtOI4-tL@gexlq50rKr zrEhF(Ah14yM9}*ChlgXa;oewpV}rX`%zX65>`SrsfDe$iIDi^5*VS z0Dfl`K(oG|J$^Uw;=_jz@9u5hx!o7*C9QV%#`=EVeYG-hA9c90dgu9bM2G+Z-qaMU zYZxcf)7Rnkz)HJ&fJM!%n;v%COZbMqy*;sBy#o3J@Bkl|JvG&bxC!|rkpCIqZ1qU?XgSH zo5OrTZ6hEe45+K84wbvaP=DQK51a7~9S1Qq)E0%s-EcE>%G&B2s&l`W7u0dAV|P!B zoT0CR^Z&M?<6JSU(||g@YV6QgOf+;%Z^y5OP8j@E%l)qa0|0Cexr=-~JDdOj002ov JPDHLkV1frFijM#Q diff --git a/docs/src/_static/images/references/logo_tailwind.png b/docs/src/_static/images/references/logo_tailwind.png deleted file mode 100644 index b9e1a28b00fd85371b819acb893da026650f6f0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55890 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 LHTfJ_lXw3QduNT% diff --git a/docs/src/_static/images/tagline.png b/docs/src/_static/images/tagline.png deleted file mode 100644 index 7f0f8567daa4935e526f797be2cd2ba4d9095869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4820 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 diff --git a/docs/src/_static/images/ukazka.png b/docs/src/_static/images/ukazka.png deleted file mode 100644 index ffe2e18f8301bdecda6b2f5aefdc0a8732c837d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17894 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

XKZs_4>~hgU15)AGDAx`YVo2vD12q_9P|)lypLu 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 diff --git a/docs/src/_static/images/ukazka2.png b/docs/src/_static/images/ukazka2.png deleted file mode 100644 index 41b8ab9b105509d967dd221fe106b6c08626c749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17463 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 LRHe%#pZfm~w!tXk diff --git a/docs/src/_static/js/jquery-1.9.1.min.js b/docs/src/_static/js/jquery-1.9.1.min.js deleted file mode 100644 index 006e953102..0000000000 --- a/docs/src/_static/js/jquery-1.9.1.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license -//@ sourceMappingURL=jquery.min.map -*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="

",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; -return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) -}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("'),u.bgiframe.appendTo(c),c.bind("tooltipmove"+h,o.adjustBGIFrame)),m=r("
",{id:"qtip-rcontainer"}).appendTo(t.body),o.redraw(),u.overlay&&!v&&(s=function(){u.overlay[0].style.top=n.scrollTop()+"px"},n.bind("scroll.qtip-ie6, resize.qtip-ie6",s),s(),u.overlay.addClass("qtipmodal-ie6fix"),v=i)},adjustBGIFrame:function(){var e=n.get("dimensions"),t=n.plugins.tip,r=u.tip,i,s;s=parseInt(c.css("border-left-width"),10)||0,s={left:-s,top:-s},t&&r&&(i=t.corner.precedance==="x"?["width","left"]:["height","top"],s[i[1]]-=r[i[0]]()),u.bgiframe.css(s).css(e)},redraw:function(){if(n.rendered<1||d)return o;var e=a.style,t=a.position.container,r,i,s,u;return d=1,e.height&&c.css(l,e.height),e.width?c.css(f,e.width):(c.css(f,"").appendTo(m),i=c.width(),i%2<1&&(i+=1),s=c.css("max-width")||"",u=c.css("min-width")||"",r=(s+u).indexOf("%")>-1?t.width()/100:0,s=(s.indexOf("%")>-1?r:1)*parseInt(s,10)||i,u=(u.indexOf("%")>-1?r:1)*parseInt(u,10)||0,i=s+u?Math.min(Math.max(i,u),s):i,c.css(f,Math.round(i)).appendTo(t)),d=0,o},destroy:function(){p&&u.bgiframe.remove(),c.unbind(h)}}),o.init()}var i=!0,s=!1,o=null,u="x",a="y",f="width",l="height",c="top",h="left",p="bottom",d="right",v="center",m="flip",g="flipinvert",y="shift",b,w,E,S="qtip",x={},T=["ui-widget","ui-tooltip"],N="div.qtip."+S,C=S+"-default",k=S+"-focus",L=S+"-hover",A="_replacedByqTip",O="oldtitle",M;b=r.fn.qtip=function(e,t,u){var a=(""+e).toLowerCase(),f=o,l=r.makeArray(arguments).slice(1),c=l[l.length-1],h=this[0]?r.data(this[0],"qtip"):o;if(!arguments.length&&h||a==="api")return h;if("string"==typeof e)return this.each(function(){var e=r.data(this,"qtip");if(!e)return i;c&&c.timeStamp&&(e.cache.event=c);if(a!=="option"&&a!=="options"||!t)e[a]&&e[a].apply(e[a],l);else{if(!r.isPlainObject(t)&&u===n)return f=e.get(t),s;e.set(t,u)}}),f!==o?f:this;if("object"==typeof e||!arguments.length)return h=D(r.extend(i,{},e)),b.bind.call(this,h,c)},b.bind=function(e,t){return this.each(function(o){function p(e){function t(){c.render(typeof e=="object"||u.show.ready),a.show.add(a.hide).unbind(l)}if(c.cache.disabled)return s;c.cache.event=r.extend({},e),c.cache.target=e?r(e.target):[n],u.show.delay>0?(clearTimeout(c.timers.show),c.timers.show=setTimeout(t,u.show.delay),f.show!==f.hide&&a.hide.bind(f.hide,function(){clearTimeout(c.timers.show)})):t()}var u,a,f,l,c,h;h=r.isArray(e.id)?e.id[o]:e.id,h=!h||h===s||h.length<1||x[h]?b.nextid++:x[h]=h,l=".qtip-"+h+"-create",c=H.call(this,h,e);if(c===s)return i;u=c.options,r.each(w,function(){this.initialize==="initialize"&&this(c)}),a={show:u.show.target,hide:u.hide.target},f={show:r.trim(""+u.show.event).replace(/ /g,l+" ")+l,hide:r.trim(""+u.hide.event).replace(/ /g,l+" ")+l},/mouse(over|enter)/i.test(f.show)&&!/mouse(out|leave)/i.test(f.hide)&&(f.hide+=" mouseleave"+l),a.show.bind("mousemove"+l,function(e){_(e),c.cache.onTarget=i}),a.show.bind(f.show,p),(u.show.ready||u.prerender)&&p(t)}).attr("data-hasqtip",i)},w=b.plugins={Corner:function(e){e=(""+e).replace(/([A-Z])/," $1").replace(/middle/gi,v).toLowerCase(),this.x=(e.match(/left|right/i)||e.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(e.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase();var t=e.charAt(0);this.precedance=t==="t"||t==="b"?a:u,this.string=function(){return this.precedance===a?this.y+this.x:this.x+this.y},this.abbrev=function(){var e=this.x.substr(0,1),t=this.y.substr(0,1);return e===t?e:this.precedance===a?t+e:e+t},this.invertx=function(e){this.x=this.x===h?d:this.x===d?h:e||this.x},this.inverty=function(e){this.y=this.y===c?p:this.y===p?c:e||this.y},this.clone=function(){return{x:this.x,y:this.y,precedance:this.precedance,string:this.string,abbrev:this.abbrev,clone:this.clone,invertx:this.invertx,inverty:this.inverty}}},offset:function(e,n){function c(e,t){i.left+=t*e.scrollLeft(),i.top+=t*e.scrollTop()}var i=e.offset(),s=e.closest("body"),o=r.browser.msie&&t.compatMode!=="CSS1Compat",u=n,a,f,l;if(u){do u.css("position")!=="static"&&(f=u.position(),i.left-=f.left+(parseInt(u.css("borderLeftWidth"),10)||0)+(parseInt(u.css("marginLeft"),10)||0),i.top-=f.top+(parseInt(u.css("borderTopWidth"),10)||0)+(parseInt(u.css("marginTop"),10)||0),!a&&(l=u.css("overflow"))!=="hidden"&&l!=="visible"&&(a=u));while((u=r(u[0].offsetParent)).length);(a&&a[0]!==s[0]||o)&&c(a||s,1)}return i},iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||s,fn:{attr:function(e,t){if(this.length){var n=this[0],i="title",s=r.data(n,"qtip");if(e===i&&s&&"object"==typeof s&&s.options.suppress)return arguments.length<2?r.attr(n,O):(s&&s.options.content.attr===i&&s.cache.attr&&s.set("content.text",t),this.attr(O,t))}return r.fn["attr"+A].apply(this,arguments)},clone:function(e){var t=r([]),n="title",i=r.fn["clone"+A].apply(this,arguments);return e||i.filter("["+O+"]").attr("title",function(){return r.attr(this,O)}).removeAttr(O),i}}},r.each(w.fn,function(e,t){if(!t||r.fn[e+A])return i;var n=r.fn[e+A]=r.fn[e];r.fn[e]=function(){return t.apply(this,arguments)||n.apply(this,arguments)}}),r.ui||(r["cleanData"+A]=r.cleanData,r.cleanData=function(e){for(var t=0,i;(i=e[t])!==n;t++)try{r(i).triggerHandler("removeqtip")}catch(s){}r["cleanData"+A](e)}),b.version="2.0.0-nightly-15f5c6bc20",b.nextid=0,b.inactiveEvents="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),b.zindex=15e3,b.defaults={prerender:s,id:s,overwrite:i,suppress:i,content:{text:i,attr:"title",deferred:s,title:{text:s,button:s}},position:{my:"top left",at:"bottom right",target:s,container:s,viewport:s,adjust:{x:0,y:0,mouse:i,resize:i,method:"flipinvert flipinvert"},effect:function(e,t,n){r(this).animate(t,{duration:200,queue:s})}},show:{target:s,event:"mouseenter",effect:i,delay:90,solo:s,ready:s,autofocus:s},hide:{target:s,event:"mouseleave",effect:i,delay:0,fixed:s,inactive:s,leave:"window",distance:s},style:{classes:"",widget:s,width:s,height:s,def:i},events:{render:o,move:o,show:o,hide:o,toggle:o,visible:o,hidden:o,focus:o,blur:o}},w.svg=function(e,n,i,s){var o=r(t),u=n[0],a={width:0,height:0,position:{top:1e10,left:1e10}},f,l,c,h,p;while(!u.getBBox)u=u.parentNode;if(u.getBBox&&u.parentNode){f=u.getBBox(),l=u.getScreenCTM(),c=u.farthestViewportElement||u;if(!c.createSVGPoint)return a;h=c.createSVGPoint(),h.x=f.x,h.y=f.y,p=h.matrixTransform(l),a.position.left=p.x,a.position.top=p.y,h.x+=f.width,h.y+=f.height,p=h.matrixTransform(l),a.width=p.x-a.position.left,a.height=p.y-a.position.top,a.position.left+=o.scrollLeft(),a.position.top+=o.scrollTop()}return a},w.ajax=function(e){var t=e.plugins.ajax;return"object"==typeof t?t:e.plugins.ajax=new B(e)},w.ajax.initialize="render",w.ajax.sanitize=function(e){var t=e.content,n;t&&"ajax"in t&&(n=t.ajax,typeof n!="object"&&(n=e.content.ajax={url:n}),"boolean"!=typeof n.once&&n.once&&(n.once=!!n.once))},r.extend(i,b.defaults,{content:{ajax:{loading:i,once:i}}}),w.tip=function(e){var t=e.plugins.tip;return"object"==typeof t?t:e.plugins.tip=new F(e)},w.tip.initialize="render",w.tip.sanitize=function(e){var t=e.style,n;t&&"tip"in t&&(n=e.style.tip,typeof n!="object"&&(e.style.tip={corner:n}),/string|boolean/i.test(typeof n.corner)||(n.corner=i),typeof n.width!="number"&&delete n.width,typeof n.height!="number"&&delete n.height,typeof n.border!="number"&&n.border!==i&&delete n.border,typeof n.offset!="number"&&delete n.offset)},r.extend(i,b.defaults,{style:{tip:{corner:i,mimic:s,width:6,height:6,border:i,offset:0}}}),w.modal=function(e){var t=e.plugins.modal;return"object"==typeof t?t:e.plugins.modal=new I(e)},w.modal.initialize="render",w.modal.sanitize=function(e){e.show&&(typeof e.show.modal!="object"?e.show.modal={on:!!e.show.modal}:typeof e.show.modal.on=="undefined"&&(e.show.modal.on=i))},w.modal.zindex=b.zindex-200,w.modal.focusable=["a[href]","area[href]","input","select","textarea","button","iframe","object","embed","[tabindex]","[contenteditable]"],r.extend(i,b.defaults,{show:{modal:{on:s,effect:i,blur:i,stealfocus:i,escape:i}}}),w.viewport=function(n,r,i,s,o,m,b){function j(e,t,n,i,s,o,u,a,f){var l=r[s],c=x[e],h=T[e],p=n===y,d=-O.offset[s]+A.offset[s]+A["scroll"+s],m=c===s?f:c===o?-f:-f/2,b=h===s?a:h===o?-a:-a/2,w=_&&_.size?_.size[u]||0:0,E=_&&_.corner&&_.corner.precedance===e&&!p?w:0,S=d-l+E,N=l+f-A[u]-d+E,C=m-(x.precedance===e||c===x[t]?b:0)-(h===v?a/2:0);return p?(E=_&&_.corner&&_.corner.precedance===t?w:0,C=(c===s?1:-1)*m-E,r[s]+=S>0?S:N>0?-N:0,r[s]=Math.max(-O.offset[s]+A.offset[s]+(E&&_.corner[e]===v?_.offset:0),l-C,Math.min(Math.max(-O.offset[s]+A.offset[s]+A[u],l+C),r[s]))):(i*=n===g?2:0,S>0&&(c!==s||N>0)?(r[s]-=C+i,H["invert"+e](s)):N>0&&(c!==o||S>0)&&(r[s]-=(c===v?-C:C)+i,H["invert"+e](o)),r[s]N&&(r[s]=l,H=x.clone())),r[s]-l}var w=i.target,E=n.elements.tooltip,x=i.my,T=i.at,N=i.adjust,C=N.method.split(" "),k=C[0],L=C[1]||C[0],A=i.viewport,O=i.container,M=n.cache,_=n.plugins.tip,D={left:0,top:0},P,H,B;if(!A.jquery||w[0]===e||w[0]===t.body||N.method==="none")return D;P=E.css("position")==="fixed",A={elem:A,height:A[(A[0]===e?"h":"outerH")+"eight"](),width:A[(A[0]===e?"w":"outerW")+"idth"](),scrollleft:P?0:A.scrollLeft(),scrolltop:P?0:A.scrollTop(),offset:A.offset()||{left:0,top:0}},O={elem:O,scrollLeft:O.scrollLeft(),scrollTop:O.scrollTop(),offset:O.offset()||{left:0,top:0}};if(k!=="shift"||L!=="shift")H=x.clone();return D={left:k!=="none"?j(u,a,k,N.x,h,d,f,s,m):0,top:L!=="none"?j(a,u,L,N.y,c,p,l,o,b):0},H&&M.lastClass!==(B=S+"-pos-"+H.abbrev())&&E.removeClass(n.cache.lastClass).addClass(n.cache.lastClass=B),D},w.imagemap=function(e,t,n,i){function E(e,t,n){var r=0,i=1,s=1,o=0,u=0,a=e.width,f=e.height;while(a>0&&f>0&&i>0&&s>0){a=Math.floor(a/2),f=Math.floor(f/2),n.x===h?i=a:n.x===d?i=e.width-a:i+=Math.floor(a/2),n.y===c?s=f:n.y===p?s=e.height-f:s+=Math.floor(f/2),r=t.length;while(r--){if(t.length<2)break;o=t[r][0]-e.position.left,u=t[r][1]-e.position.top,(n.x===h&&o>=i||n.x===d&&o<=i||n.x===v&&(oe.width-i)||n.y===c&&u>=s||n.y===p&&u<=s||n.y===v&&(ue.height-s))&&t.splice(r,1)}}return{left:t[0][0],top:t[0][1]}}t.jquery||(t=r(t));var s=e.cache.areas={},o=(t[0].shape||t.attr("shape")).toLowerCase(),u=t[0].coords||t.attr("coords"),a=u.split(","),f=[],l=r('img[usemap="#'+t.parent("map").attr("name")+'"]'),m=l.offset(),g={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10}},y=0,b=0,w;m.left+=Math.ceil((l.outerWidth()-l.width())/2),m.top+=Math.ceil((l.outerHeight()-l.height())/2);if(o==="poly"){y=a.length;while(y--)b=[parseInt(a[--y],10),parseInt(a[y+1],10)],b[0]>g.position.right&&(g.position.right=b[0]),b[0]g.position.bottom&&(g.position.bottom=b[1]),b[1] -

gensim

- -
-
-
gensim
-
gensim tagline
-
- - - -
-
-{% endblock %} - - -{% block document %} - - -
- - Fork me on GitHub - - -
- -
-
- -
- gensim code example -
- -
- Gensim is a FREE Python library -
    -
  • Scalable statistical semantics
  • -
  • Analyze plain-text documents for semantic structure
  • -
  • Retrieve semantically similar documents
  • -
-
-
-
- -
-
-

Features
Hover your mouse over each feature for more info.

- - - -
-
-
- robustRobust -
- -
-
- -
- supportSupport -
-
-
- -
-
-
- -
-
-

Who is using Gensim?
Doing something interesting with gensim? Ask to be featured here.

- -
-
    -
  • - “Here at Tailwind, we use Gensim to help our customers post interesting and relevant content to Pinterest. No fuss, no muss. Just fast, scalable language processing.” Waylon Flinn, Tailwind -
  • -
  • - “We are using gensim every day. Over 15 thousand times per day to be precise. Gensim’s LDA module lies at the very core of the analysis we perform on each uploaded publication to figure out what it’s all about. It simply works.” Andrius Butkus, Issuu -
  • -
  • - “Gensim hits the sweetest spot of being a simple yet powerful way to access some incredibly complex NLP goodness.” Alan J. Salmoni, Roistr.com -
  • -
  • - “I used gensim at Ghent university. I found it easy to build prototypes with various models, extend it with additional features and gain empirical insights quickly. It's a reliable library that can be used beyond prototyping too.” Dieter Plaetinck, IBCN group -
  • -
  • - “We used gensim in several text mining projects at Sports Authority. The data were from free-form text fields in customer surveys, as well as social media sources. Having gensim significantly sped our time to development, and it is still my go-to package for topic modeling with large retail data sets.” Josh Hemann, Sports Authority -
  • -
  • - “Semantic analysis is a hot topic in online marketing, but there are few products on the market that are truly powerful. -Gensim is undoubtedly one of the best frameworks that efficiently implement algorithms for statistical analysis. -Few products, even commercial, have this level of quality.” Bruno Champion, DynAdmic -
  • - -
  • - “Based on our experience with gensim on DML-CZ, we naturally opted to use it on a much bigger scale for similarity -of fulltexts of scientific papers in the European Digital Mathematics Library. In evaluation with other approaches, gensim became a clear winner, especially because of speed, scalability and ease of use.”Petr Sojka, EuDML -
  • -
  • - “We have been using gensim in several DTU courses related to digital media engineering and find it immensely useful as the tutorial material provides students an excellent introduction to quickly understand the underlying principles in topic modeling based on both LSA and LDA.”Michael Kai Petersen, Technical University of Denmark -
  • - -
-
- -
-
-
- -
- get started -
-{% endblock %} diff --git a/docs/src/gensim_theme/domainindex.html b/docs/src/gensim_theme/domainindex.html deleted file mode 100644 index 947a01ea8e..0000000000 --- a/docs/src/gensim_theme/domainindex.html +++ /dev/null @@ -1,56 +0,0 @@ -{# - basic/domainindex.html - ~~~~~~~~~~~~~~~~~~~~~~ - - Template for domain indices (module index, ...). - - :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -#} -{% extends "layout.html" %} -{% set title = indextitle %} -{% block extrahead %} -{{ super() }} -{% if not embedded and collapse_index %} - -{% endif %} -{% endblock %} -{% block body %} - - {%- set groupid = idgen() %} - -

{{ indextitle }}

- -
- {%- for (letter, entries) in content %} - {{ letter }} - {%- if not loop.last %} | {% endif %} - {%- endfor %} -
- -
- {%- for letter, entries in content %} - - - {%- for (name, grouptype, page, anchor, extra, qualifier, description) - in entries %} - - - - {%- endfor %} - {%- endfor %} -
 
- {{ letter }}
{% if grouptype == 1 -%} - - {%- endif %}{% if grouptype == 2 %}   {% endif %} - {% if page %}{% endif -%} - {{ name|e }} - {%- if page %}{% endif %} - {%- if extra %} ({{ extra|e }}){% endif -%} - {% if qualifier %}{{ qualifier|e }}:{% endif %} - {{ description|e }}
- -{% endblock %} diff --git a/docs/src/gensim_theme/genindex.html b/docs/src/gensim_theme/genindex.html deleted file mode 100644 index 9406bc5000..0000000000 --- a/docs/src/gensim_theme/genindex.html +++ /dev/null @@ -1,77 +0,0 @@ -{# - basic/genindex.html - ~~~~~~~~~~~~~~~~~~~ - - Template for an "all-in-one" index. - - :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -#} -{% macro indexentries(firstname, links) %} -
- {%- if links -%} - - {%- if links[0][0] %}{% endif -%} - {{ firstname|e }} - {%- if links[0][0] %}{% endif -%} - - - {%- for ismain, link in links[1:] -%} - , {% if ismain %}{% endif -%} - [{{ loop.index }}] - {%- if ismain %}{% endif -%} - - {%- endfor %} - {%- else %} - {{ firstname|e }} - {%- endif %} -
-{% endmacro %} - -{% extends "layout.html" %} -{% set title = _('Index') %} -{% block body %} - -

{{ _('Index') }}

- -
- {% for key, dummy in genindexentries -%} - {{ key }} - {% if not loop.last %}| {% endif %} - {%- endfor %} -
- -{%- for key, entries in genindexentries %} -

{{ key }}

- - {%- for column in entries|slice(2) if column %} - - {%- endfor %} -
- {%- for entryname, (links, subitems, _) in column %} - {{ indexentries(entryname, links) }} - {%- if subitems %} -
- {%- for subentryname, subentrylinks in subitems %} - {{ indexentries(subentryname, subentrylinks) }} - {%- endfor %} -
- {%- endif -%} - {%- endfor %} -
-{% endfor %} - -{% endblock %} - -{% block sidebarrel %} -{% if split_index %} -

{{ _('Index') }}

-

{% for key, dummy in genindexentries -%} - {{ key }} - {% if not loop.last %}| {% endif %} - {%- endfor %}

- -

{{ _('Full index on one page') }}

-{% endif %} - {{ super() }} -{% endblock %} diff --git a/docs/src/gensim_theme/layout.html b/docs/src/gensim_theme/layout.html deleted file mode 100644 index c763ad9476..0000000000 --- a/docs/src/gensim_theme/layout.html +++ /dev/null @@ -1,226 +0,0 @@ -{%- block doctype -%} - -{%- endblock %} - -{% set script_files = ["_static/js/jquery-1.9.1.min.js", "_static/js/jquery.qtip.min.js", "_static/js/jquery-migrate-1.1.1.min.js", "_static/js/jquery.anythingslider.min.js"] %} -{% set css_files = css_files + ["_static/css/jquery.qtip.min.css", "_static/css/anythingslider.css"] %} -{%- set url_root = pathto('', 1) %} - -{%- macro script() %} - - - {%- for scriptfile in script_files %} - - {%- endfor %} -{%- endmacro %} - -{%- macro css() %} - - {%- for cssfile in css_files %} - - {%- endfor %} - -{%- endmacro %} - - - - - - - - - - - - - {{ metatags }} - {%- block htmltitle %} - gensim: {{ title|striptags|e }} - {%- endblock %} - - {{ css() }} - - - - - - - - - - -
- {% block header %} -
-
-

- gensim logo -

-
- -
-
-
gensim
-
gensim tagline
-
-
-
-

Get Expert Help

-

• machine learning, NLP, data mining

-

• custom SW design, development, optimizations

-

• corporate trainings & IT consulting

-
-
-
-
- {% endblock %} - - {% block navbar %} - - {% endblock %} - -
-
- - {{ script() }} - - {% block content %} -
- {% block document %} -
-
- {{ title|striptags|e }} -
-
-
-
- {% block body %} {% endblock %} -
-
- {% endblock %} - -
-
- {% endblock %} - - {% block footer %} - - {% endblock %} - - - - - diff --git a/docs/src/gensim_theme/page.html b/docs/src/gensim_theme/page.html deleted file mode 100644 index 17a9301653..0000000000 --- a/docs/src/gensim_theme/page.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "layout.html" %} -{% block body %} - {{ body }} -{% endblock %} diff --git a/docs/src/gensim_theme/search.html b/docs/src/gensim_theme/search.html deleted file mode 100644 index 4cdc6935c0..0000000000 --- a/docs/src/gensim_theme/search.html +++ /dev/null @@ -1,56 +0,0 @@ -{# - basic/search.html - ~~~~~~~~~~~~~~~~~ - - Template for the search page. - - :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -#} -{% extends "layout.html" %} -{% set title = _('Search') %} -{% set script_files = script_files + ['_static/searchtools.js'] %} -{% block extrahead %} - - {{ super() }} -{% endblock %} -{% block body %} -

{{ _('Search') }}

-
- -

- {% trans %}Please activate JavaScript to enable the search - functionality.{% endtrans %} -

-
-

- {% trans %}From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list.{% endtrans %} -

-
- - - -
- {% if search_performed %} -

{{ _('Search Results') }}

- {% if not search_results %} -

{{ _('Your search did not match any results.') }}

- {% endif %} - {% endif %} -
- {% if search_results %} -
    - {% for href, caption, context in search_results %} -
  • {{ caption }} -
    {{ context|e }}
    -
  • - {% endfor %} -
- {% endif %} -
-{% endblock %} diff --git a/docs/src/gensim_theme/static/doctools.js b/docs/src/gensim_theme/static/doctools.js deleted file mode 100644 index d4619fdfb1..0000000000 --- a/docs/src/gensim_theme/static/doctools.js +++ /dev/null @@ -1,247 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -} - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s == 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * small function to check if an array contains - * a given item. - */ -jQuery.contains = function(arr, item) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] == item) - return true; - } - return false; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node) { - if (node.nodeType == 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this); - }); - } - } - return this.each(function() { - highlight(this); - }); -}; - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated == 'undefined') - return string; - return (typeof translated == 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated == 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) == 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this == '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/docs/src/gensim_theme/static/jquery.js b/docs/src/gensim_theme/static/jquery.js deleted file mode 100644 index 198b3ff07d..0000000000 --- a/docs/src/gensim_theme/static/jquery.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.1 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; -f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() -{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/docs/src/gensim_theme/static/underscore.js b/docs/src/gensim_theme/static/underscore.js deleted file mode 100644 index 5d89914340..0000000000 --- a/docs/src/gensim_theme/static/underscore.js +++ /dev/null @@ -1,23 +0,0 @@ -// Underscore.js 0.5.5 -// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the terms of the MIT license. -// Portions of Underscore are inspired by or borrowed from Prototype.js, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore/ -(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;gf?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)}); -return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length); -var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false; -if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length== -0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&& -a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g, -" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments); -o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})(); diff --git a/docs/src/support.rst b/docs/support.rst similarity index 100% rename from docs/src/support.rst rename to docs/support.rst diff --git a/docs/src/tut1.rst b/docs/tut1.rst similarity index 100% rename from docs/src/tut1.rst rename to docs/tut1.rst diff --git a/docs/src/tut2.rst b/docs/tut2.rst similarity index 100% rename from docs/src/tut2.rst rename to docs/tut2.rst diff --git a/docs/src/tut3.rst b/docs/tut3.rst similarity index 100% rename from docs/src/tut3.rst rename to docs/tut3.rst diff --git a/docs/src/tutorial.rst b/docs/tutorial.rst similarity index 100% rename from docs/src/tutorial.rst rename to docs/tutorial.rst diff --git a/docs/src/wiki.rst b/docs/wiki.rst similarity index 100% rename from docs/src/wiki.rst rename to docs/wiki.rst diff --git a/examples/README.txt b/examples/README.txt new file mode 100644 index 0000000000..52e41b2613 --- /dev/null +++ b/examples/README.txt @@ -0,0 +1,9 @@ +.. _general_examples: + +Examples +======== + +General examples +---------------- + +General-purpose and introductory examples for gensim. \ No newline at end of file diff --git a/setup.py b/setup.py index 2c16ded0f7..b6b56488fb 100644 --- a/setup.py +++ b/setup.py @@ -307,7 +307,11 @@ def finalize_options(self): 'distributed': distributed_env, 'test-win': win_testenv, 'test': linux_testenv, - 'docs': linux_testenv + distributed_env + ['sphinx', 'sphinxcontrib-napoleon', 'plotly', 'pattern'], + 'docs': linux_testenv + distributed_env + ['sphinx', + 'sphinxcontrib-napoleon', + 'plotly', 'pattern', + 'sphinx_gallery', + 'matplotlib'], }, include_package_data=True, diff --git a/tox.ini b/tox.ini index 43f090ba47..81188ba26e 100644 --- a/tox.ini +++ b/tox.ini @@ -52,7 +52,7 @@ basepython = python2 recreate = True whitelist_externals = make deps = .[docs] -changedir = docs/src +changedir = docs commands = make clean html @@ -61,7 +61,7 @@ commands = make clean html recreate = True whitelist_externals = make deps = .[docs] -changedir = docs/src +changedir = docs commands = make clean html upload From 46951250cd0429954cfb893e2ad1d7944d1863d1 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 15:22:18 +0300 Subject: [PATCH 08/42] Add legacy apiref --- docs/apiref.rst | 464 +------------------------------------- docs/apiref_nextgen.rst | 477 ++++++++++++++++++++++++++++++++++++++++ docs/conf.py | 7 +- docs/indextoc.rst | 1 + 4 files changed, 487 insertions(+), 462 deletions(-) create mode 100644 docs/apiref_nextgen.rst diff --git a/docs/apiref.rst b/docs/apiref.rst index f9959d3aed..d31a824258 100644 --- a/docs/apiref.rst +++ b/docs/apiref.rst @@ -2,465 +2,13 @@ API Reference ============= -.. _models_ref: +.. _api_ref: -:mod:`gensim.models`: Models -============================ +.. currentmodule:: gensim -.. automodule:: gensim.models - :no-members: - :no-inherited-members: +.. toctree:: + :maxdepth: 0 + :glob: -Models ------- -.. currentmodule:: gensim.models + generated/* -.. autosummary:: - :toctree: generated/ - :template: class.rst - - ldamodel.LdaModel - ldamulticore.LdaMulticore - ldaseqmodel.LdaSeqModel - tfidfmodel.TfidfModel - rpmodel.RpModel - hdpmodel.HdpModel - logentropy_model.LogEntropyModel - normmodel.NormModel - translation_matrix.TranslationMatrix - atmodel.AuthorTopicModel - word2vec.Word2Vec - keyedvectors.KeyedVectors - doc2vec.Doc2Vec - fasttext.FastText - phrases.SentenceAnalyzer - phrases.Phrases - phrases.Phraser - coherencemodel.CoherenceModel - basemodel.BaseTopicModel - callbacks.Callback - -Workers -------- -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - lsi_worker.Worker - lda_worker.Worker - - -Dispatchers ------------ -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - lsi_dispatcher.Dispatcher - lda_dispatcher.Dispatcher - -Wrappers --------- -.. currentmodule:: gensim.models.wrappers - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - ldamallet.LdaMallet - dtmmodel.DtmModel - ldavowpalwabbit.LdaVowpalWabbit - wordrank.Wordrank - varembed.VarEmbed - fasttext.FastText - -.. _downloader_ref: - -:mod:`gensim.downloader`: Downloader -==================================== - -.. automodule:: gensim.downloader - :no-members: - :no-inherited-members: - -Functions ---------- -.. currentmodule:: gensim.downloader - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - info - load - -.. _scripts_ref: - -:mod:`gensim.scripts`: Scripts -============================== - -.. automodule:: gensim.scripts - :no-members: - :no-inherited-members: - -Functions ---------- -.. currentmodule:: gensim.scripts - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - glove2word2vec.get_glove_info - glove2word2vec.glove2word2vec - word2vec2tensor.word2vec2tensor - segment_wiki.segment_all_articles - segment_wiki.segment_and_write_all_articles - segment_wiki.extract_page_xmls - segment_wiki.segment - -.. _corpora_ref: - -:mod:`gensim.corpora`: Corpora -============================== - -.. automodule:: gensim.corpora - :no-members: - :no-inherited-members: - -Corpora -------- -.. currentmodule:: gensim.corpora - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - bleicorpus.BleiCorpus - csvcorpus.CsvCorpus - indexedcorpus.IndexedCorpus - lowcorpus.LowCorpus - malletcorpus.MalletCorpus - mmcorpus.MmCorpus - sharded_corpus.ShardedCorpus - svmlightcorpus.SvmLightCorpus - textcorpus.TextCorpus - ucicorpus.UciCorpus - wikicorpus.WikiCorpus - -Dictionaries ------------- -.. currentmodule:: gensim.corpora - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - dictionary.Dictionary - hashdictionary.HashDictionary - -.. _similarities_ref: - -:mod:`gensim.similarities`: Similarities -======================================== - -.. automodule:: gensim.similarities - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.similarities - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - docsim.Shard - docsim.Similarity - docsim.MatrixSimilarity - docsim.SparseMatrixSimilarity - index.AnnoyIndexer - -.. _parsing_ref: - -:mod:`gensim.parsing`: Parsing -============================== - -.. automodule:: gensim.parsing - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.parsing - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - porter.PorterStemmer - -Functions ---------- -.. currentmodule:: gensim.parsing - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - preprocessing.remove_stopwords - preprocessing.strip_punctuation - preprocessing.strip_tags - preprocessing.strip_short - preprocessing.strip_numeric - preprocessing.strip_non_alphanum - preprocessing.strip_multiple_whitespaces - preprocessing.split_alphanum - preprocessing.stem_text - preprocessing.preprocess_string - preprocessing.preprocess_documents - preprocessing.read_file - preprocessing.read_files - -.. _summarization_ref: - -:mod:`gensim.summarization`: Summarization -========================================== - -.. automodule:: gensim.summarization - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.summarization - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - bm25.BM25 - -Functions ---------- -.. currentmodule:: gensim.summarization - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - summarizer.summarize - summarizer.summarize_corpus - mz_entropy.mz_keywords - bm25.get_bm25_weights - keywords.keywords - -.. _sklearn_api_ref: - -:mod:`gensim.sklearn_api`: Sklearn API -====================================== - -.. automodule:: gensim.sklearn_api - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.sklearn_api - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - atmodel.AuthorTopicTransformer - d2vmodel.D2VTransformer - hdp.HdpTransformer - ldamodel.LdaTransformer - ldaseqmodel.LdaSeqTransformer - lsimodel.LsiTransformer - phrases.PhrasesTransformer - rpmodel.RpTransformer - text2bow.Text2BowTransformer - tfidf.TfIdfTransformer - w2vmodel.W2VTransformer - -.. _viz_ref: - -:mod:`gensim.viz`: Visualization -================================ - -.. automodule:: gensim.viz - :no-members: - :no-inherited-members: - -Functions ---------- -.. currentmodule:: gensim.viz - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - poincare.poincare_2d_visualization - poincare.poincare_distance_heatmap - -.. _interfaces_ref: - -:mod:`gensim.interfaces`: Interfaces -==================================== - -.. automodule:: gensim.interfaces - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.interfaces - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - CorpusABC - TransformedCorpus - TransformationABC - SimilarityABC - -.. _utils_ref: - -:mod:`gensim.utils`: Utils -========================== - -.. automodule:: gensim.utils - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.utils - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - SaveLoad - FakeDict - RepeatCorpusNTimes - ClippedCorpus - SlicedCorpus - InputQueue - -Functions ---------- -.. currentmodule:: gensim.utils - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - get_random_state - synchronous - file_or_filename - deaccent - copytree_hardlink - tokenize - simple_tokenize - simple_preprocess - any2utf8 - any2unicode - call_on_class_only - identity - get_max_id - dict_from_corpus - is_corpus - get_my_ip - safe_unichr - decode_htmlentities - chunkize_serial - chunkize - smart_extension - pickle - unpickle - revdict - deprecated - randfname - upload_chunked - getNS - pyro_daemon - has_pattern - lemmatize - mock_data_row - mock_data - prune_vocab - qsize - keep_vocab_item - check_output - sample_dict - strided_windows - iter_windows - flatten - lazy_flatten - -.. _matutils_ref: - -:mod:`gensim.matutils`: Matutils -================================ - -.. automodule:: gensim.matutils - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.matutils - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - Scipy2Corpus - Dense2Corpus - Sparse2Corpus - MmWriter - MmReader - -Functions ---------- -.. currentmodule:: gensim.matutils - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - blas - argsort - corpus2csc - pad - zeros_aligned - ismatrix - any2sparse - scipy2scipy_clipped - scipy2sparse - sparse2full - full2sparse - full2sparse_clipped - corpus2dense - veclen - ret_normalized_vec - ret_log_normalize_vec - unitvec - cossim - isbow - convert_vec - kullback_leibler - jensen_shannon - hellinger - jaccard - jaccard_distance - dirichlet_expectation - qr_destroy diff --git a/docs/apiref_nextgen.rst b/docs/apiref_nextgen.rst new file mode 100644 index 0000000000..e32a76407a --- /dev/null +++ b/docs/apiref_nextgen.rst @@ -0,0 +1,477 @@ +============= +API Reference +============= + +.. _models_ref: + +:mod:`gensim.models`: Models +============================ + +.. automodule:: gensim.models + :no-members: + :no-inherited-members: + +Document -> Vector +------------------ +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ldamodel.LdaModel + ldamulticore.LdaMulticore + ldaseqmodel.LdaSeqModel + tfidfmodel.TfidfModel + rpmodel.RpModel + hdpmodel.HdpModel + atmodel.AuthorTopicModel + doc2vec.Doc2Vec + +Word -> Vector +-------------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + word2vec.Word2Vec + fasttext.FastText + +Utils +----- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + keyedvectors.KeyedVectors + phrases.SentenceAnalyzer + coherencemodel.CoherenceModel + basemodel.BaseTopicModel + +Workers +------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + lsi_worker.Worker + lda_worker.Worker + +Dispatchers +----------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + lsi_dispatcher.Dispatcher + lda_dispatcher.Dispatcher + +Wrappers +-------- +.. currentmodule:: gensim.models.wrappers + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ldamallet.LdaMallet + dtmmodel.DtmModel + ldavowpalwabbit.LdaVowpalWabbit + wordrank.Wordrank + varembed.VarEmbed + fasttext.FastText + +.. _downloader_ref: + +:mod:`gensim.downloader`: Downloader +==================================== + +.. automodule:: gensim.downloader + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.downloader + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + info + load + +.. _scripts_ref: + +:mod:`gensim.scripts`: Scripts +============================== + +.. automodule:: gensim.scripts + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.scripts + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + glove2word2vec.get_glove_info + glove2word2vec.glove2word2vec + word2vec2tensor.word2vec2tensor + segment_wiki.segment_all_articles + segment_wiki.segment_and_write_all_articles + segment_wiki.extract_page_xmls + segment_wiki.segment + +.. _corpora_ref: + +:mod:`gensim.corpora`: Corpora +============================== + +.. automodule:: gensim.corpora + :no-members: + :no-inherited-members: + +Corpora +------- +.. currentmodule:: gensim.corpora + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + bleicorpus.BleiCorpus + csvcorpus.CsvCorpus + indexedcorpus.IndexedCorpus + lowcorpus.LowCorpus + malletcorpus.MalletCorpus + mmcorpus.MmCorpus + sharded_corpus.ShardedCorpus + svmlightcorpus.SvmLightCorpus + textcorpus.TextCorpus + ucicorpus.UciCorpus + wikicorpus.WikiCorpus + +Dictionaries +------------ +.. currentmodule:: gensim.corpora + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + dictionary.Dictionary + hashdictionary.HashDictionary + +.. _similarities_ref: + +:mod:`gensim.similarities`: Similarities +======================================== + +.. automodule:: gensim.similarities + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.similarities + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + docsim.Shard + docsim.Similarity + docsim.MatrixSimilarity + docsim.SparseMatrixSimilarity + index.AnnoyIndexer + +.. _parsing_ref: + +:mod:`gensim.parsing`: Parsing +============================== + +.. automodule:: gensim.parsing + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + porter.PorterStemmer + +Functions +--------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + preprocessing.remove_stopwords + preprocessing.strip_punctuation + preprocessing.strip_tags + preprocessing.strip_short + preprocessing.strip_numeric + preprocessing.strip_non_alphanum + preprocessing.strip_multiple_whitespaces + preprocessing.split_alphanum + preprocessing.stem_text + preprocessing.preprocess_string + preprocessing.preprocess_documents + preprocessing.read_file + preprocessing.read_files + +.. _summarization_ref: + +:mod:`gensim.summarization`: Summarization +========================================== + +.. automodule:: gensim.summarization + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.summarization + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + bm25.BM25 + +Functions +--------- +.. currentmodule:: gensim.summarization + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + summarizer.summarize + summarizer.summarize_corpus + mz_entropy.mz_keywords + bm25.get_bm25_weights + keywords.keywords + +.. _sklearn_api_ref: + +:mod:`gensim.sklearn_api`: Sklearn API +====================================== + +.. automodule:: gensim.sklearn_api + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.sklearn_api + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + atmodel.AuthorTopicTransformer + d2vmodel.D2VTransformer + hdp.HdpTransformer + ldamodel.LdaTransformer + ldaseqmodel.LdaSeqTransformer + lsimodel.LsiTransformer + phrases.PhrasesTransformer + rpmodel.RpTransformer + text2bow.Text2BowTransformer + tfidf.TfIdfTransformer + w2vmodel.W2VTransformer + +.. _viz_ref: + +:mod:`gensim.viz`: Visualization +================================ + +.. automodule:: gensim.viz + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.viz + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + poincare.poincare_2d_visualization + poincare.poincare_distance_heatmap + +.. _interfaces_ref: + +:mod:`gensim.interfaces`: Interfaces +==================================== + +.. automodule:: gensim.interfaces + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.interfaces + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + CorpusABC + TransformedCorpus + TransformationABC + SimilarityABC + +.. _utils_ref: + +:mod:`gensim.utils`: Utils +========================== + +.. automodule:: gensim.utils + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.utils + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + SaveLoad + FakeDict + RepeatCorpusNTimes + ClippedCorpus + SlicedCorpus + InputQueue + +Functions +--------- +.. currentmodule:: gensim.utils + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + get_random_state + synchronous + file_or_filename + deaccent + copytree_hardlink + tokenize + simple_tokenize + simple_preprocess + any2utf8 + any2unicode + call_on_class_only + identity + get_max_id + dict_from_corpus + is_corpus + get_my_ip + safe_unichr + decode_htmlentities + chunkize_serial + chunkize + smart_extension + pickle + unpickle + revdict + deprecated + randfname + upload_chunked + getNS + pyro_daemon + has_pattern + lemmatize + mock_data_row + mock_data + prune_vocab + qsize + keep_vocab_item + check_output + sample_dict + strided_windows + iter_windows + flatten + lazy_flatten + +.. _matutils_ref: + +:mod:`gensim.matutils`: Matutils +================================ + +.. automodule:: gensim.matutils + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.matutils + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + Scipy2Corpus + Dense2Corpus + Sparse2Corpus + MmWriter + MmReader + +Functions +--------- +.. currentmodule:: gensim.matutils + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + blas + argsort + corpus2csc + pad + zeros_aligned + ismatrix + any2sparse + scipy2scipy_clipped + scipy2sparse + sparse2full + full2sparse + full2sparse_clipped + corpus2dense + veclen + ret_normalized_vec + ret_log_normalize_vec + unitvec + cossim + isbow + convert_vec + kullback_leibler + jensen_shannon + hellinger + jaccard + jaccard_distance + dirichlet_expectation + qr_destroy diff --git a/docs/conf.py b/docs/conf.py index 6398750581..a8d0d7fc61 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -47,13 +47,12 @@ # The encoding of source files. # source_encoding = 'utf-8' -# Generate the plots for the gallery -plot_gallery = True - sphinx_gallery_conf = { 'doc_module': 'gensim', 'backreferences_dir': os.path.join('modules', 'generated'), - 'reference_url': {'gensim': None} + 'reference_url': {'gensim': None}, + 'plot_gallery': True + } # The master toctree document. diff --git a/docs/indextoc.rst b/docs/indextoc.rst index 7533955697..b86c63966c 100644 --- a/docs/indextoc.rst +++ b/docs/indextoc.rst @@ -9,3 +9,4 @@ support wiki apiref + apiref_nextgen From 15e418d6f9ee6651616523f6973be9cc00a2c14c Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 15:51:22 +0300 Subject: [PATCH 09/42] Fix fasttext references --- gensim/models/fasttext.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/models/fasttext.py b/gensim/models/fasttext.py index 6ea76819cf..78ff610e6b 100644 --- a/gensim/models/fasttext.py +++ b/gensim/models/fasttext.py @@ -161,7 +161,7 @@ def train_batch_sg(model, sentences, alpha, work=None, neu1=None): class FastText(BaseWordEmbeddingsModel): """Class for training, using and evaluating word representations learned using method - described in [1]_ aka Fasttext. + described in [1] aka Fasttext. The model can be stored/loaded via its :meth:`~gensim.models.fasttext.FastText.save()` and :meth:`~gensim.models.fasttext.FastText.load()` methods, or loaded in a format compatible with the original From 9dfcb68cd5d139701a34d80aa4c5efbdf9f71c77 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 19:29:39 +0300 Subject: [PATCH 10/42] Restore static files --- .gitignore | 1 - docs/_static/broken_example.png | Bin 0 -> 21404 bytes docs/_static/css/anythingslider.css | 291 +++++++ docs/_static/css/jquery.qtip.min.css | 1 + docs/_static/css/style.css | 787 ++++++++++++++++++ docs/_static/favicon.ico | Bin 0 -> 1150 bytes docs/_static/gallery.css | 192 +++++ docs/_static/images/arrows.png | Bin 0 -> 3088 bytes docs/_static/images/bg.png | Bin 0 -> 9986 bytes docs/_static/images/bullets.png | Bin 0 -> 3156 bytes docs/_static/images/checker.png | Bin 0 -> 4738 bytes docs/_static/images/default.png | Bin 0 -> 15403 bytes docs/_static/images/direct-install.png | Bin 0 -> 18131 bytes docs/_static/images/download.png | Bin 0 -> 37697 bytes docs/_static/images/favicon.ico | Bin 0 -> 1150 bytes docs/_static/images/features/converters.png | Bin 0 -> 6784 bytes .../features/efficient_implementations.png | Bin 0 -> 5491 bytes docs/_static/images/features/free_lgpl.png | Bin 0 -> 4347 bytes .../images/features/memory_independence.png | Bin 0 -> 7477 bytes .../images/features/platform_independence.png | Bin 0 -> 4952 bytes docs/_static/images/features/robust.png | Bin 0 -> 7212 bytes .../images/features/similarity_queries.png | Bin 0 -> 4194 bytes docs/_static/images/features/support.png | Bin 0 -> 7439 bytes .../images/forkme_left_white_ffffff.png | Bin 0 -> 6727 bytes docs/_static/images/gensim-footer.png | Bin 0 -> 7242 bytes docs/_static/images/gensim.png | Bin 0 -> 25785 bytes docs/_static/images/gensim_code.png | Bin 0 -> 53822 bytes docs/_static/images/gensim_compact.png | Bin 0 -> 18280 bytes docs/_static/images/get-started.png | Bin 0 -> 26520 bytes docs/_static/images/googlegroups.png | Bin 0 -> 5513 bytes docs/_static/images/loading.gif | Bin 0 -> 1737 bytes docs/_static/images/logo-gensim.png | Bin 0 -> 23359 bytes docs/_static/images/logo-gensim_compact.png | Bin 0 -> 12430 bytes docs/_static/images/menubutton.png | Bin 0 -> 3084 bytes docs/_static/images/references/logo_dtu.gif | Bin 0 -> 8843 bytes .../images/references/logo_dynadmic.png | Bin 0 -> 14396 bytes docs/_static/images/references/logo_eudml.png | Bin 0 -> 9669 bytes docs/_static/images/references/logo_ghent.png | Bin 0 -> 4993 bytes docs/_static/images/references/logo_ibcn.png | Bin 0 -> 38342 bytes .../_static/images/references/logo_issuu.jpeg | Bin 0 -> 3946 bytes .../_static/images/references/logo_roistr.png | Bin 0 -> 71879 bytes .../references/logo_sportsauthority.png | Bin 0 -> 4211 bytes .../images/references/logo_tailwind.png | Bin 0 -> 55890 bytes docs/_static/images/tagline.png | Bin 0 -> 4820 bytes docs/_static/images/tagline_compact.png | Bin 0 -> 5183 bytes docs/_static/images/twitterbird.png | Bin 0 -> 3758 bytes docs/_static/images/ukazka.png | Bin 0 -> 17894 bytes docs/_static/images/ukazka2.png | Bin 0 -> 17463 bytes docs/_static/no_image.png | Bin 0 -> 4315 bytes docs/_static/pygments.css | 69 ++ 50 files changed, 1340 insertions(+), 1 deletion(-) create mode 100644 docs/_static/broken_example.png create mode 100644 docs/_static/css/anythingslider.css create mode 100644 docs/_static/css/jquery.qtip.min.css create mode 100644 docs/_static/css/style.css create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/gallery.css create mode 100644 docs/_static/images/arrows.png create mode 100644 docs/_static/images/bg.png create mode 100644 docs/_static/images/bullets.png create mode 100644 docs/_static/images/checker.png create mode 100644 docs/_static/images/default.png create mode 100644 docs/_static/images/direct-install.png create mode 100644 docs/_static/images/download.png create mode 100644 docs/_static/images/favicon.ico create mode 100644 docs/_static/images/features/converters.png create mode 100644 docs/_static/images/features/efficient_implementations.png create mode 100644 docs/_static/images/features/free_lgpl.png create mode 100644 docs/_static/images/features/memory_independence.png create mode 100644 docs/_static/images/features/platform_independence.png create mode 100644 docs/_static/images/features/robust.png create mode 100644 docs/_static/images/features/similarity_queries.png create mode 100644 docs/_static/images/features/support.png create mode 100644 docs/_static/images/forkme_left_white_ffffff.png create mode 100644 docs/_static/images/gensim-footer.png create mode 100644 docs/_static/images/gensim.png create mode 100644 docs/_static/images/gensim_code.png create mode 100644 docs/_static/images/gensim_compact.png create mode 100644 docs/_static/images/get-started.png create mode 100644 docs/_static/images/googlegroups.png create mode 100644 docs/_static/images/loading.gif create mode 100644 docs/_static/images/logo-gensim.png create mode 100644 docs/_static/images/logo-gensim_compact.png create mode 100644 docs/_static/images/menubutton.png create mode 100644 docs/_static/images/references/logo_dtu.gif create mode 100644 docs/_static/images/references/logo_dynadmic.png create mode 100644 docs/_static/images/references/logo_eudml.png create mode 100644 docs/_static/images/references/logo_ghent.png create mode 100644 docs/_static/images/references/logo_ibcn.png create mode 100644 docs/_static/images/references/logo_issuu.jpeg create mode 100644 docs/_static/images/references/logo_roistr.png create mode 100644 docs/_static/images/references/logo_sportsauthority.png create mode 100644 docs/_static/images/references/logo_tailwind.png create mode 100644 docs/_static/images/tagline.png create mode 100644 docs/_static/images/tagline_compact.png create mode 100644 docs/_static/images/twitterbird.png create mode 100644 docs/_static/images/ukazka.png create mode 100644 docs/_static/images/ukazka2.png create mode 100644 docs/_static/no_image.png create mode 100644 docs/_static/pygments.css diff --git a/.gitignore b/.gitignore index 015dac262b..9a34bd7ff6 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,6 @@ cython_debug docs/_build/ docs/generated/ docs/auto_examples/ -docs/_static docs/notebooks/.ipynb_checkpoints dedan_gensim.tmproj gensim*.egg-info diff --git a/docs/_static/broken_example.png b/docs/_static/broken_example.png new file mode 100644 index 0000000000000000000000000000000000000000..4fea24e7df4781c2c32c8d7995511ac89e953145 GIT binary patch literal 21404 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 a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +a.headerlink:hover { + background-color: #006699; + color: white; + visibility: visible; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +table.docutils { + border: 0; + border-collapse: collapse; +} + +div.versioninfo { + margin: 1em 0 0 0; + border: 1px solid #ccc; + background-color: #DDEAF0; + padding: 8px; + line-height: 1.3em; + font-size: 0.9em; +} + +.document { + line-height: 150%; +} + +/*table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} +*/ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +div.admonition, div.warning { + font-size: 0.9em; + margin: 1em 0 0 0; + border: 1px solid #86989B; + background-color: #f7f7f7; +} + +div.admonition p, div.warning p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} + +div.admonition pre, div.warning pre { + margin: 0.4em 1em 0.4em 1em; +} + +div.admonition p.admonition-title, +div.warning p.admonition-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border-bottom: 1px solid #86989B; + font-weight: bold; + background-color: #AFC1C4; +} + +div.warning { + border: 1px solid #940000; +} + +div.warning p.admonition-title { + background-color: #CF0000; + border-bottom-color: #940000; +} + +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + +.first { + margin-top: 0 !important; +} + +pre { + font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.015em; + padding: 0.5em; + border: 1px solid #ccc; + background-color: #f8f8f8; + line-height: 120%; + overflow-x: auto; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +dt:target, +.highlight { + background-color: #fbe54e; +} + +dl.class, dl.function { + border-top: 2px solid #888; +} + +dl.method, dl.attribute { + border-top: 1px solid #aaa; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3f458e48108791d9a8907b25a93633818ce6a073 GIT binary patch literal 1150 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

v^Xke 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 QW&i*H07*qoM6N<$g1uzaZ2$lO literal 0 HcmV?d00001 diff --git a/docs/_static/images/default.png b/docs/_static/images/default.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc837c804be06d0d34b55bffd5a43bcfa6e6340 GIT binary patch literal 15403 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 L73n%j(~$oGGx=K> literal 0 HcmV?d00001 diff --git a/docs/_static/images/direct-install.png b/docs/_static/images/direct-install.png new file mode 100644 index 0000000000000000000000000000000000000000..5cfee8efe319cfd07651e020e64bbc0c11de9b79 GIT binary patch literal 18131 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/features/free_lgpl.png b/docs/_static/images/features/free_lgpl.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba6d4cc6bc323820f424d7a30e87f3cc5f42fdb GIT binary patch literal 4347 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/features/platform_independence.png b/docs/_static/images/features/platform_independence.png new file mode 100644 index 0000000000000000000000000000000000000000..914dcf89d2a9ded9272108c3a6e2b086c4010d7f GIT binary patch literal 4952 zcmV-e6Q}HnP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000PsNklb(B75;i=c4k+*JG+v&CA1PE#HNG^hs|X$LN=GUjDo>7iCv}w zgfaoiMG+T=4=TaIDFeX>%vAvj#|cOxKq(}Yb5LbW!ez`MFcR8XfsoLyq}6J7?&Wkg%nybk)@S=+`sfH}7@#`(6*Bl%gXy1|7V0NCGPh(+9r2KfS&~5?EQ7K9FVU zXKttKc!wkKR$;Hf3`39EINr$UJ$x<+UEttd<%&a&2# zjPLh$R|OjkyWpBJvG1v9xJ}nu3b*zl?A;< zavUuln33V)7$+*KE(Z-0b34RFw!9!MlVND_po}M6@$T+8b>W0;7?}Fbv@*Hf6Ifo* zE0bk$;HmxtT%EkhIC6>A*(H-MQ zXNz8U5BP&ch^p5C0Fed`b+vq@u9LUhMAYYQ^$m5|#ecj$ai2XYe$X2`|2ltntHA#@ zWv0!BZP{6qMUSgH{J}y*)d~QBX%a|R;=-mzrmy+YgN4pr2`t{~8^+n_k=a=v2t5+} z;?=S15D1-|nYTUV#fN$L8#_{Fu`G5>95Y4qxVk|K6`)a(nqOT}?rhWzvVP4g<>y;n zR$08&H=MK4;^#7-ajD`_9IyW|Dy&_YkTt>Pu-muiZu5DE_8i7Ll+(>x1ky(;%x_<6%N6#p120BRI}FG;Yi@-Z&R2)C7b%I8 z5Q#*v|M1?JtmvcH&z1h?_MW@lH(L;}aoYGCQFL}jd9VNtaw#keV8FnHfb*w>235hZ zwR8LzTUFRvwAnX^=b1l^9GT&jaR!0VL0I%wIM&B5A`m(V(Jdl7Yg(M0=RRGu+4tBz z!Ea4@Rj?ud`3WzGqN@x1!J=mHio!rM1yqy?QA4Hgw-)?=La5X-t>Cqr=gg=Y0zhsv zsE?IE3jGm@iJdTZbhcX%xX%`C_VxS*@UIC1`OWm~S#HtU2~u!B!tz(JEI`v3Sf+r+ zu$|V`P{}mO>NY7YuAeW3Rh14aD`7&xYJmcAcOh{J{$LS$bW6gh;aLebp8e;-O}@mI zHjB2T%(3xgUCyMJ+-_$lNTCC$k6i*Rz%T$^<3Jb(0%fF8RWW_-PyA+^)kZh`RI1ih z4E2A7x@aR0!1*=9aO^V5YYLF=>y2T9M|Kl<_Vb1LJ|_Sy{wQUhT_9^;m^|C~`i@pZ=^{uqyy<{4dj{ z^~&q)gWla{;MCcF(KF{xo;D0~r{Ex~XHI#=>5TJ2syTp~$QJ+r%L3#W1B<#~8V-83 zM7gM|cw)l>$$BINnn(1|IFC?J!yw(_t>H|MqAYEz86y>g^#fAC4iB7j|-}n0291Mwq zT9I2zV2f=p!TmVKrSAu0IKgrRN3YF+KX|ygU(F@dJOb8kd>Y8P4ZL9hs?5N~$HO#j zw6r+_D)9FuXx7aS3%uQnz~u%-iP1?L z7fJLxCy<{jS(-{FR$Qt3vZ0PzE^iWefrqNxig(KZG?js-v2c01B6LI6<*5Ag{9MWZ zsAcMXYvTM|Nz-JE@}Cct$0CHf<9os;aEL_-A`u3$DBy5*g`qL@W<}jaLn9l$4W0c! zqCP)QiYf|ys`Sg6DotS_#{0nY3>qU0Eb0MoPk{eYy`seEV$?6G6I0ADfCw?VV4Pljn{NTJG>*f0zg*) zN)t#KKwZnBOKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000qJNkl*pBV2kd-AW1m@s|gj2j>K>vQLzFJWxwR zQVYfyfIEO4KrO$u1Uw3SF$e-e4W%$e0OtjdU>#`XQNjr;dkR!(qzuu4lB7${p!dQ24cO?G-Al^~# zQrvvQWt56VlGLoaCkg{<^*Z0){WF?%*Z#bjx?7Z1zY^5TZ$uRJJ8e8uf7FQ0C%rB{ zJv_SR!PIc6aSEk1vkQwn@SP`kZE7|Y1Zy4EIt1ahsoC&>?>xcm!Xip*j8mkBONK|s zACREV#Al-chlv=@4oi3px9HsD@koRN$oAM zm9HF`S^VY9LghUOSm&_Lfxyf{2IFY0lQ~%i;*A}dG zXstLnInOhD_W!iGGJmBgg^0p=hcOm?oM}!Q#2!Eb&fd6|o>Bp0EMueN`}+n4u583f zWKw+l{LN+x63G?i!JP~NGEB#1R$8?YrFj0p z;o#Xlzu8bM1TTw#u^z2{JJ70Ap-r6n9kFq@DkUg^W@6qkJTm(2O=pakjkVxi$H)WD zIb4o9S}TG;XK|zzg5a#fJJ$w<&N+;=Y+OH99vU8fv=N(k;5|x&*tieG#=l!mXMxVl zYmDm~92)&c(ZSXulSkjHun&%oj(++2D=sW*rAVzqNoQX0Xr&0lfFw0c&n>W0ty8Tv z0O%=o)7w*IWT>Ag3`kRhb&gJean4ih?&8KPFD&l<>2vqa%}oEHCHTO)wc{Ve+5JoN zGmnLVS~{fwt;xK1I2GP;$pu@t4)^!6_m$zDuN;}#dDX>dBS4y_St4s~UMaewh}pSC zp4qdXgNLWF*3nf6=`KV7G~$G2oT9a2V*MBwpTCun;Q^X)g6|0S)LOLGTz%65}b83n=#Ee#u%IVc#ar4(9A7Xxc^(bsnwg@e8YCOUwjVz@$a zi6b^AaiIa5XcckON;p;a7Xj=1 zDuQ?9=sbI0JjA=-emP+f;GD}4xPwMGXR0femAeDn-}m+uX92cs*}PhSM|M9!x!8>s z$I8kIb*t_=d&}m}gi7TYo>?ObLw@ws^Mrw7+r~3UjajurISm{0z5_9UFbLT9%4?*? zaqaduk)&zy{oTW#(BkZt-;MVT)EnX4jh_BDMh5gSi`zC>n;tn zCbb5YZ!A!n*QREv)$3ez?q(Wsyeh*>hx_OtAdJEcxstS1=$t^%a{T9+7hdA<)GT8o z{a9yn_wfWeKy-NVOOrDM)5|25RWzk7K%g}qNGu4dZ)B+dE!H}`^VrOT(8}}Dp-I+_ z4Urm)_x?DI3tDT!DDqR2N1xrl?}a@8TeqEi{+hMp7o|xe*4kB>)#nx7`mrGn9GYZg zxDV@mhou}NgZ*zgJUP{uSXmay_IiQ<#=5t9*y6pf7ouQ&cXu>koWXlg-Xls;sWyn? zl%DbKcEEM=6s0uQ`sI7R{G~e{+I9cemlx*@K;OV{aLdjQf9ST4e*6m_`a3n~a%=ST zbTc!*%u2OES0Ty}4{+8{>@Eyw9ek{rn8PAc6gU7pzDj`M;o(0Mk@t8Hg+hoD!J3TA zI}t)W3zaH`LWpk>Ilym)o&0Qc~&ukX6%?eBd2tWBG*O4B5B zB%i~jc)~!_Xe2pJ@_1`WQcE*QSU=K-5{1VThT(}Ww6L^{F*XlGg;GM2T7p1P2m`vi z3pkevnAnVvwcJOE5Qd(qshM9i8#MrZ5&+W8M$Jx5&HUo5O`EQ=d1i09Q40W^b0ld> zqY)FQ24fuFI~vUd@3VD-;3NV#pHJkoR*6GU;z(14NexMAh!X?eW79nKi+}A#;FTLufo5*C6+V`9@a zaifVd4r?6N*i~~X0b{Z?t+mJY;XKy*oRZrUEs!+o`;#QyCn6P5QVhewxlSt)$y~&H zk0@yigMc82m%OHN^p=XU^S0aXNt(?M{p#mG{7GjA>CL})-P?BFcKg?Q3xTTF>bU$n zpI2}A4BtfrV=}t!TJd3>Pt*7X?|j{RUv^RO;t5pZ!H52fW|AUGC}=yT3+4TyR9QsG z3TzNj%r7nzYC%x#%qs{!XQy2~J-jlt*!a!!&wXe5$e||z#@3yA_c&7P85-!zeVumkLKJZ8EjO*UfQV!?Hh?H7%%#q~ zP&8*52$*iD2P}tZ4Rko}f=pG-s`u+7deLq045YpSFsaC2q z;{-(TxU3i>%goj~y1KdmpSfi&g!7=h-5UnMjKg8Ptjayd5}9|z)({(u3yoEw-|Zy2 z$mN(|vTF&X~(cnQThls*j=qf}MySu1V zDrg<#uGJ!YnP!}IEW}HzdZ?WgJ9FD(blF-%xm?bKO>_71S?z(qVl_R_S~n2|9Q0Vy zyi{F{LLR&q5+ffA3#AvvM@M!z=SZ!|5yIfCq0wm2TPhNSSx+Z5meg2`u^3~r0L+og z=cA1%`S&KjCpDHhNeRM;-cpf9qk*#qldqXtgL96tv5_5Np|mG4-0uBq7;RgiREY52 z(N!v6Un-SK%Zp3Iae^p?cRsHPGEG+Nbw)=9I5Ig)lB8&@0l&%`r)rnAw4NcCC5l2u zM+T_Y>ZI1@9Sd@|@|e^hvcmfD!BV4MxS>(6+%0kv7gA{z@WhqmyYq8Pw*qLb5od9^ zuV;uPSQ7)D^=n2rGBr!B-XPGrEo4goIj$Yw>G#H3O2uy0tr?+OtJ7@e!R=P}MZJeg zrN(llMsJvYSCOnzP+Ne?(n8BW|J_CdA5l^9dS@+41f^6vNX4nFYgcb#tYh7}F%}k= zn4Me1xvXDGj!wtvKFi|Hp_F1|c!0ryewLOinWb|M)(Tw6a!#9WB#j>~Rp#zJzFch! zaIDnx-p7@@jEb&PT8lNN>eA-Vqps4`h=d~9DGDOg>kZ;&%-}#D{pDU3mMSbQuMp=A zfleDJttdnhgMRt;?6-LDMl{?eaN}<$uhh&*6kBdy`Ml+$_oJWZeMIliX;}L*Ads2zv$BXorvJ9{bkymy{6b(RADG5?U4Sq=57PYI&ZywWdwz> z_S0Ut!CHInDtvD>bpevkE3TR@^^Uspl@MNsU=dq=g_#6nYk z%VFASy3>lj!9jZZ2Jqft2zM%7ICo}x22nYUXeBXd*T=%ijvDhohGPP>g~{mh=-}u! zZ;LxM$-jZnRkAG1m^R-!89KL}s#q*`j1o~4QS2>KEDxZ<5HE@->i&b3rDcpUIFr+9 z>$06I-KOEGJ(j52Bd5mJc~BaVHl22P5?onYCXBj1?nTj6EHOPj#i2v5(kgyjo)kN4 z>NXqQv13O^b4szew8U@r?I#EV-uu3tTyVkpM5Upx9+|EEzV{AiO~z84dF|-r!M{~H zylHfN{ad51;)t~tcU=EpX`Kaevpzd>^vILmCjU9McH%F+3O0D>P&zOt=GNl(;GHzyW)F~?79aCfnaL#a0PgFdg{obwP$R>=3VD7C@?*B0MSJo@)@v$M+`6&xod@;7+UEqSc8hMt?9O&{5H-{-o! zi-WaVwFel@H&q4-ItV9%C?d#vM?n;!gK%ShdLIMJKx1iXss6A3{CBrC8jX49oXQ_b zu=&WkTBi}>^$O4uA^;*Fa?VAyS~bcS?FEK_HNg0ReS0L1lgTtqJRo5h$!iDqE8uG2 zC@=-g11q&!t(sdf29kUTU|!FY2(KpwTASDT2=WEP+#L!)7f{SC(3k&T%s-cWa}A&l zECDO|gCNc0HlF6AWd)ZD;Qy~N(3;5Rnn{j#t9*36R~<0jatC|dt2>FybZ+{z4^O-v u0er`+aLNPJQ@%gde5VW2*Y)Jb{|*3AO@wTh0X5D50000000W>0fLJSS^xk57<5HgbW?9;ba!ELWdK2BZ(?O2Mrm?o zcW-iQb5FA$P5=M^7IZ~ebVG7wVRUJ4ZXi@?ZDjy3GcPbSFEBW+jN+I801v)NL_t(& zfvuTakQ`Te$A9Pab!K{|=ek-+tINv55*FAdzJ@@MDQs6kz*MN@fj};mJme{P3`L$& z;Wd@Fq)f;INmZUGNHCZfY>FbqW0I;^wy+IeX;-_e-JO};x%Tb!IeF-r)$U3*lJTkP zI;Xo&cYpuy{(UWsF#ue-^6K05dVSflY``Fd0GQ2!*=eyZrv39`-|WRY<7w^-s=L^fSD3!`M&ibV+O^LupFR7( z?*{;RYk82%bAk>NdzfGj+!F}#&c}R@Wl4f+urwJ@UR+yUU4CBy93XL@xTD10l887Y z9U;V#eTSc)?>7c~-^aG(V!yxppEqxAwcj@YcOrBS=rHkjzIK$`w@c<0m|Crd=X>{W zZQXnc2;MgUM>+X!#LtP7@^%o14-V}IfslfwlP9q)>o=~v`s%k1aO>9tZ~zL%7%a=e zwjCVDK?s54xVWx^Z9CYug_IH@B$g$yZD$5Z;<_%b>(0(C9LK?Ri}zTTL}iLf5OC_$ zDYQ1vzWRT!e)GKouy4O4uq=ySuS>7nMF@fC`E)uRR##Wab49)0APhrp+*l)uA{G~q zFv&+idHVM_&f1l3vzrxkAhg7$JD`%{M8PN?1}Ngg_gO zW7~|!<8NGj{c7)n4}9?7?*@RFi}L4JufBb3adCMbiH(6QO-a)f$8``hRodRVNu${$ zj$-PK26>)ij6rKn5Cpic%V;!0O2OXlF0FP4DJ4-9k){bj5CDRHzt40sp;RsrhV_{@ zgE)#A4o6BG{p7`q7ytVnB~T10C6n=ln>RO+mW6HESe8Yj*~D=ihJztm=cp`TFc=^$ z3!^oY@d$$;iDP`^IF9i=57%+oSieEL-DYcR8-VF_f{+qR zT7>nGBuUBAbVjV8R4y@{OgR6659|j&l`D5Toz{VS0busI=9fyGK63`gagkEcYPE4( zhkB!q<9e6_oV~x%03b~hJkQ^MM{TCtj^m<~+9y~DNtz}&jzga3fSJvZ=Nii@?7_06 z^=`z!qXaC=W@CMW&5aFg$L8$WWv*SnhUa>O^*Tu$6V^knt*l^K7WbV$&))7X2Cyxg zUayDixm1HHy?&2ov&m>Uq~G7=fd?KSiXyhRw-7?&x(;cY5=|o>eE1=Jzx1nUes=(c zt}0sXHjPFD&-ZXWk5;>d$`sPF_H&y~X8{1$b*R@HNGa*}dIZ&g;b2GcG%6smINVK=q%v4E@_ssxxRsASu|TM7LOk%O%i5$YHHiE&^pH$jb+)iI~^`vy2P=?MFx8V-g@&5T-Q0E17Pk_hmNGv24e~! zX__Jc+jh{o#&tc?G)3h()5!!W1Zi5h!y9Wi*xTLZp@$zPNfM$cB8noiEJFy1%5#z= zL8$`7Xf#AA#o6U$!Z2iOYnzRk!#J!$zk1x!2IiyLY!cS%L{UT>MVvZ)8rO9gk0&f1 zKY=lZQpxA_*Is9Nd70haJ#v-dmr7(=N)#zP&qHMjAq83+j4>ohOqMBZ+osuS62~z& z*49{9IL5uI&^`b&<350tf@m7Cx_X_3g$1}&G0QS++ooJDk>`c?X|>uYrC3{CrQ0p)31iG%3*ojvW(+8$Xfzuv z99uvsMHEGZVMv;0SeC`osU=+3WjdX5_4TVXnhhqC3DapbtJv%rBP7%56yGl)Ws#DP zMnj~OD5Yi$aB&<5&-2;a-J{d#%!1zCA-JOo328AN47jnjR(P5$+bNkX3Iv!X~BEifTS(*XeGa+&dDLYgFau7@@n*HxrxhVT0*m4Oh20pI1g z1;E_0om}PA>kTTE3by0mdmc*VWLY)~I7PzO@AViCu2XN+v22^FZ6k$5$f7pZS_4IL zHV0J=0y58=)c^*2mhDc)V{F?;=lMP@?;((x{bIh~>v3)6ZB8yNF_}ydLXu@E3&)Pp z-PxgBsi3k9fX$5!RIZ7mDdkE9V+^kA64pZEBqomIqR2;(>zp)6uxy*rXha;x)T%Wq zl?rhj6%x3IcyQ-HmTM|Og%3UWAdce@$1ytBIIe?bS@^z>l#=my%hDuItv{D#-lMwQg|EB^Jp}SLLMPVl7!Aehv{TWv(d!1ZPGL)S2?v>h{_eE znLEu?h7=OZvRFKRoXyP*YPA}^=aD4IJeRnuv7bsDMVzK7S(Xt+Q`T13*xK4+FxV?P z7PB;BI+;)|mza#l_`XjZ#e`v4sG%hZf&k01P^#!ic%Fxp1>v6Was0#y@?7!Dw|>F> z7cLOT@sS{QFGg%`*?9Ui=P;|B1==I z(Uc@fig)EXxz;$2L#13H2r2~CDj37_|M(BYal$8_x=a{`OsCVkXFu;?#6k$h;}JJE zHn1IsrKKg}IHud(nU$Cl-}eh6my%AW!`ZXTy!GZAg|DyG@H`J8ibCG9EG#LJ(xOx< zfq;#T4OXvT=iIsb_~}o7!q=aFp3gn^9OurRE7~+h-+LUG15irQXf$ZGT3D7vmSwcs zokF6sJ;oSXaXf4KI(VMPV~;<@)aldodp+Vf#lP|Amk`FFXF!Yr%aTQdN*8uv48&1Hsaz_`&l~HMN+p77fDnRwRvYZ>?6A=3 zV9x^O*47q#ySse*+uuS;i-#Zn2#-Gc*dq@<^w9s@vkF<3#csdP+S(e&jvYe?K_w_U z&`BJ#v9ZCiW5)=?klnpKn$0E~>+3j9(P21wa*4rkz-TyRJQ@|ju3DYhN0oNF!_v|c zS{HS2xm>1RuaoCFU--iB@ttpfiz`=NC643gE!+C^rAr^$xjPk_d7>hnZc+(?{l2H` zx>%M)wOXZAF7JCMAtgbj!kIH?$hF3@EL_*cc5Gb7;q;j^q-ly2ve4<7#OHmYd7Ti> zYV2Gop8Djc`0jsvhifbLqf*M3qbPpn(MKQMdRG9(m|0O{_S+-l@t9hzwy!!nJ3H8p zL%ZFk*X!ZAF0SXXwY5c9uhZ>z$(16k*Rd^&Qn}2{%}v63opCh6b3JmcQF*>k@LYwn zETdkpV`le1{psJ~2QPjf0}lc(YptJs{PD*(?n;HU)|5&mgp_oW%#Df6llBk6taTF=77yF-m?(+-Zd*QpR2yp>;C5oe` zFJFG@+U+XDE&nd1WHOo1@AViA29!#r!T_sP`n$XPo+-~Va;>QZ!J$8#2gm&X!BIxt z>3lw`EWX;uW#>V93}ebTIab{E|=GS_OqXT=JCfLd*xHlJoChle)vOxbGcG4t*os4 z`4|7-OFubm#Ipkm&fO{r5B@*C^ZH&1Kf1o{9)?`0@UOn|mAC)(U%vV5#fuNTD24p! z%RhRFEK4s`DwV$j9+3y0xDCX?`RMxnIPS!}L-$2t_Fw+PKN_s8{PNke%gaA_KOa@WOlkw|KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000s?Nklo^I!iLrxY<6OM!TD(pIu@wRaV+amjkU#+>B&3m$H0qhr z^vv}1{kxpAe{|0<2qYj`{>Z61)m>kIr@!a<&U<;@_XuMQ|B{CVaKjBZywP<9U^B*S zio&o@OW`WZiL$L)>>a0`o!hWDqe9655bxgKur#L*XM3YZ1||v%UaA>|zLMIsm1RvM z#D3r(fw?yV;@*4j?GSha<5J*e9YsYQ2B$2?eKxyppf#wpCJ=xD z(OqPKK)^_4hP6wlS+KpC{oAg)bu!bxSe=?258JH|NXx!eDm4py2l$6Kv;(hWWPz{f zD9T4sa91i@Noe8fk$NUCA1jP){i8~8;NP3bzn;@2>Y>viW58y_QAI)sxF*f9%bTS!ZF2!s()5E3*){HkHGFibRh z!8O8gO`pG>_a#%!gdg%vjxT&OyFbMZKBg9 z;u|lgwQ-d4`~r*B_IR!3-(l>;r`B(M`>ze1xA~zx5B#66%^rVY)^@zF0UrRuvjLQ^ zLEuwS7#u6E9lv|q&JPOdrN7*a#Qky4**sK8v1vHZ#p{b)G@7Mw)r~kK!&td2Dj7q$ z3gJkEBT=qGC1Y6mEbiz!dfxK^wyy82-87tMsE{J=Ih&i2xLges>fG z$AC|r3*fm3xH<~2abthe&$4A?4HIj780txqR^SYcLp%jK z0KbK4)Sy;@TBY;dZ-EZMjbRUrkybF&lVoCT4_ijoFy5b~kVzF?XHxpyDFUv?VMJDcIs}BFrKr_~htSljp zK1CE5blXSk?pu-|T?b`L7@iET)m$C607$n-*e zS7B_+T?3N`{>O{^_ugi^-uD6hx(Mhf{Pjd8w{L9QRXa55<~13Y@%}99do#pc3n>JC z7%^XMak5;av{2`CXwfUzvt|}rb|+*mCwU<{q1E$Y-Z_ubOoN&768*UZLp@3IDG$d| zBs`n-y%~&wNNY|nwQnBVcGceUsbl+^wd$`+rM~)_1dK87GFrdwyzM)`9?SRtFzrf4 zdozp{(_Qe;@$T!Vpw`V{U=WcZ8TpJX2IBro zt?>)ZpuMBg@L6j5jP_>e&&Kf_MclO*EvE6q2tSxds)4Vr+kDxsXCJ=j7AKZ?7x0sF z5!f7s!EI~L+w!Tt^Dg-#M;dRSC&@@}nqiG(&|Xo^6qg*^Kn2sWyEk zr?z0inmU@G{Dx93F(r7gIsIakJqW>JwA`CTW0pA_1?mb$f|6GNQ?Ttor&&jzehf5Vo z^9_P9LJC1P?y_!8ntaMd+3r;rUjDv`bWictC=9<2tUr^0ZH)N?+}Kwqc3ig)JMo(_ zN70u{P|U=zl|&muxz^(7Y=x=$8qHR7uMC@4WAyPAc;a>B_0{(neO!jktDCLn-l_Q- zM`tUPYb~@f*h*5&#OTWuL2$?Z@7xF@#f!CPY5C*PAN zpHE{cfdWyH^s9}eW@dk$+4oRjEc=Y`3#whmoI@TO3!L&4 zqhJ2uD=bfhK~ULp<>Se|-fhL`5Hi(9C(~H%I@!Y~sFzDL04LI;Tgpd&GMVmuaD~8! z5B@y{7DEY+1SbKi&;zj)m=LBWaSzQ?nE4rYz}n8L)++(3*I`0hW7Vp!`cv-je^kiW z;P!&qn1}N>gO@-RdTYy##FRpM9=0n{LW6-waz2m%>Z|iW9y$b+qdIyX15t$b zeS)YX4-iz|vp=lpW3<8O z6>Sr|iA{#kn2rcE+H{?~Q=3XDSH}lu8Sm;HFlT!$;^hfQ@MaJ3nvXKec;%`KExLL& z3L{L^4RJ~$ltfCFBZvDYLU)Ad)(=X8l7PWPnkbA`Yw6aqWRU>UfH2G=I(8lf5yo$K zDJq2PVq2X~1E%9EZ^|$fECIF!!gWC^39ZStV zRT%bH!sxdrcCx-Qec^S-_FzKrmmr#+#T0Uo%3&_Nocfr@NoNyFbMw>LeGhh|!x={D zy|^FQZk^q94QSV+v2oKYZV^$);?^sxwL*bxaDb#+$5;lcWuoa>{H0DwtqlC%zKs{| zEskyY4{*o=Xe;|IQ^`Uj5b7r~=Dcfe!v#1yu4Ldn?TH^&;XM6? z7*_o>%~MC2&HaG6;30xT2e51PpGHz0aH4Q0%LFW=FKA2kOgWjosr~WaxwEnL%1^ci zd&rIChPpun_;sNEzHePE-w;<8VO_*E(7@_`IL)vVxL1fS7QuHSqP!tc%&2xrL3-qa;}z6 z>~r~4=NZ|AivYq0JYjorfJizoI! zu}7hQv{d&wHD9OJ@-YTHM=_8~FxZnMlkg;V^1H&0ZC`$a|CEq}F$g=h9Xt8mOv00c zJxK;~2|Pz(jG@{JIyHC0N15oJ=O4fSxoW-oJtf3nEZ4@X6WM2#5Eno9=Fd#IqDW`>A=4&w0+GQ+ncRK0y ztSzJ%EoR6h96;cQnp5*NW)|xNTA0%FPyFG@gHPXSDeHdVFJ7%CZVDkksPl3VWq*2p`ox{b_CEZT@ym8yJw0C^O?Wo0Wsys|*h}rvx}{%u=YhmCPhVFrMhvCMcPY8CUT7=t|t)~!jiChcJ< zMWhXjb)O^C6{Z&&_ig|YmhF7(Rr^AgWudi3cPgY8mF4{L(S1Mr@S5Qb zpJC|y-N$E_a4gA&fgIVmgQXP3OpKVV$i!Vr^L1u?RqU6wVlDv-q^Av#3fi% zE)$tJMc1Q0m!LlzClz-(Z(eH_8$O4p7dSq|zq z64`8)L?S^LhG_WfAnEngA5K1lFQ{#O8rUs)Qi7z?5UrAWa1s~8>spG zr^BTRexMoa%TP$iaBYcaD;!&q76D`=Y$_6O2k3U2)!kj`x=7c7H3_mQu+ttA(8kaX zG;>Q$j!aiLF;}J9iip|rclQ7MzPoCb@;&iH>XtAJDVNLa-@l($tF^Kd!Wi?iZIM!v z&*#~+X%mG);d|BU((lVu?~@a6yYe^2HgEq*%$BT4yR2Q4W+0a!9dod4i9Y@u(VyM= zQh}_^%eO#^&Sw-LKl1yi@wX5Jnx&@Csf9WxPA_qKsZG5dQa*X)^M{{&_;)L%BOkMr zx@3B0=2wp%J<9a-^qFnYR}y$B(Fi6cCf++bGV*W!?*6~~*S;Tc`L18O_Whsy{5KP+ z)SxFLikTSw`2>YR4~Zv#fV2DeAf9A7tiDp?3ux5vueyc$WxveaT$$2*o!Ls0mR8iO z)u|tR^S^!akssc@dtjh{@Y1(k`rSQy_x`(M$BrF2%Mrk<5)jLelTzv(J9d1nR;$(a z?Ah}LfWdWRdIwOkSm&5Y%5DQrcO-G6 zK{Q)pVg1{A{@;FwO0`Zq5;R-B-t*Jl-@EUBe&b80jvtxKW-=SLz4fhsJT*0S=l=cs z?*>%2R59lwAi8-$c74MFa2&_mwr$((Qc8Qzo;|lW8jYiXbN<%tSMJ#L;hWFj_Kr() zjSX-GJ9EW205mbnw4KU>Upu?CxByJ0&1CZru3sp`oFj z<#PGJi4({7EX*&I45Tvy>n^!!4RM)t|Rh%_^=AU!f=r(9m#NIOf^xK=80g z&iTTs#$vHryWO5yTwHu+W@hHGdcA&VRn6P(0$xoZTsEiG1XkO=T(uk4s$H?V*CQYq zi^YZ$iNv_2)PUtUeSx$JPT0=JD&=H4XeW9slAi3gz%;>pM13w|VH$h7sqB)a!xK6T zPin18z%NK)Y3aN!eZE5AU-I~W0{~D=Yfc89fdT*k N002ovPDHLkV1ktaazy|D literal 0 HcmV?d00001 diff --git a/docs/_static/images/forkme_left_white_ffffff.png b/docs/_static/images/forkme_left_white_ffffff.png new file mode 100644 index 0000000000000000000000000000000000000000..60c60a6342300f3a0674a805d14d0758fae79114 GIT binary patch literal 6727 zcmYjWdpy(s_unSe7-4SZR*_*Sx#W^&B9zQ*tlV$KTsM?UGBk6^eaI!veJHn5o7^wO z_CZ8)$t9LrsFWnhZ{PoZf4twX_w{ui=lMF%=Q-#7PC;F{2mv1f0{{SswbcbQZ_NAO zc2Iz~w=ZYd@dnv&3tYHE$o24Boj(Jlv$Jk*-|9MNY*4Tp9Ai*?>(XvQPOexzef z^Rqzi*RFlj&4+RS?7uX2b#kW~-OUg%eHyOo?`GPc-LGAfmPdmsxm@l^JR;q8Zx(zF zh#3&1lKfSk2~0GpT*|-f+8#+@^DNgSi7L9CqNPHbsxB3%2N|YUU5nkC#P0vwQw{iH zXu5Gj5-}M=!gnM6m0I`yd}-8dZEeM;>%B#7ZEeL0z;;ca$Nl|&abSVW3H0-0xboo> zUJXR7?nX@t3_>MQ0+*vjUz3giX;N_9>jaC}CIf&v+=iwWP4~5ALuBiuqk~3c`=;)2 z)yc@nT%kuL07nTA2Mi*Ge5A~Ep1Sj6)!;|p;Z3aL)vD1$hC&E%qrTcVG*2PCk?2wj;jBtKAhzaH`5}e2E-C$AyPIM%kU2(-U3l) zbZOTfz(zBEwh>c)foizEh|k)Ata6LAB0^La@$4n><0gZQ3{!}qd%)w?(1A00v>CKi z?VA&d;gVbsA3Zg&?Bj6p)T5Aky(yR6Z|$QeOs=l4ucvm^GnrQ(KOMK(t^}wAYk_g^ z$+)`3f2jvxL5Hp#QDuK=aXnD>^|gDDv)Vlo!|3uIn{u3u8H}%V4z~bitV3!hIzk}^~0k!)sE$?#KF-k z0jaxPd%ud0aTs1f4{Shm-Yo=c|Mzm{b;zS|tw!zNIWdZR{{Q~&yhLZSkLm~BXSBNs zVkRZF7*aOQAU;@c7+TxZEl~kugCN9>lo%$N2QikCE<~yDW3Y+pBDAOVXIg+Hq}uba zsLuMm0Y07WJIyZTE1QfQ_7@=p_VI2SA8e1@dNVxyDL`Pb@j-MmP}!+B@~fb`gG5x< zVbb@Q&fN`Ta~99vo7;X%Ljq(J+iin)=8z1~AbX{VE9fYU*u)PDP$|dp5 zbjr0BpOhn~z3v`48|u+R8s9J7U_2z)0x%nuw|f%!E#KXxK5;$8pb-_N(|khUX+c$+ ztvH5JIP8vMrAuOmM}aD7llj)8Ho6B1gu#KJav|96GhBt8=}tdRJ(xZD-d;*WQHY-= zrR^4&K=uOE$<*ru)L)Rtmzegf2*1*d%{jFAlHD3bA=*m*)*OMmL{W6iib8C?bq=Y0 z@wL-=xWw>HmcO)%X?^}M(!O~}4_lLW5P`M$DLsW8eqj8(P&-@u3J=(A4?geZbOZgj zYt_ZUI<)w+?vYF6&r_!VelK%p0vfT!fh|K|G0%n#(W;WxjkYgnj{+G4)}$u&D94P| zI(vqcvne@+oR(ufGktjHPp#4RTv&PlQoFYoVAinJd)` z$UkC8tZZ9KIx5`c7Pl9%_1~G%`%_<^%?5vrosZpq->!VXhp*d8OH>H!r`2cx#AcV& z$uLc<45RIM;&OuDb{2Vvw(>pZYlo9f_6 z8SzS?wQ_*UTdVG6uARYrWW|y-!}$35$jK+8ruD%u*7d`RSEEEq^{@XY;}D~gZ{3gD z-R>=G!sFCyy0x--K*6zdAY&^-DI{9E;h;aC4T5}Wnb6(i{jEYsi_!g8m^9;+rYXG7 z{5gIpePD*CzLPtv4?`Y_XbEo}{WfF&5TbQQkZIzUi!X&;<*GDPah--qf1 zxg$r8IQ|ZG6&l!Df4<--aq=?C{mxF+vC-L}=MQ#1)Z!Km_489s+Rks2rQJ?-C;XNG zq6bwG;vUl^FJ4GG`QN!w-hNiHn2e*>H?-A7n@I|yj#yc$y&?kz%1zws`lXkSUEe$t z(z#Rphg;ux*-Wldq5Ip}?D;h9PQN*6F-50?yT>SU<9$X zgu3c$n$%Ay9Oy+lEB)JADjyntQ86~W$nM~{n4J;9{|6HLd@Ff zH{82ABi_4fPcoyoCY>fJig*0(hzRkrh;!}Z=kqgz;5o|qB?Z^XIeuvVp)J!CW_#+b zID&&V4hD!9I(o_jk@@Yt?Th3W%ctjNE@^jE@@VM2ya52WNp#0kC91L$fHKA#jEblb zV$7h#vwDe3z9IAbJS!-4kuZhJj;7ZU;|RN(y5IGfCQ$#*pDw?1U4X}TOv=yA9ibht z+TD23xO8ds{C+!7_DeUPsBWW#(zFp3aBicQQ|v5*rS8bQ+{hPS8{ZlHrjuT=;BIaHki7v+CG)1O?(=wI0FI~2&%1`<{w6v z-krFFwE`2Y4eb?H3S>c_Pz@0*Dsf4_O=3)52hgxW1wD4}NRJ z_-mzwtyDwCgwS8>ajk>J?E;6VXI1enLrXxbhD!fW>`Q1Oqx_97K@-}iL)Y)N-2rgK zi9l&D7}zlLnAqX;W~*i;d<#QdY*XeMGBeTAiLxrm>3=Wnmp z)zX-vdTm3vm_nDJ5dUdaoRvCFJ%|2^A2ZP;>@E-8CJ>Zkuj1qo{b4KI`MCYq<@wMU zQtClb4|zhr*h}QGBy?}Wt@e{}&v_4&ZTY8FP0bwT}UwIh&t5D6hN9EWx zuLmo7PA&v8A&ew=s;6qibT@FhE%}eq%!S-?3+A6(Kx(}(+lu+2A5`~Y&fNvApa(zU zP_bG@QNRPpWDrJcA;JBas8v;u;cAJuI>c(=u&wx^na|SCPlCyEi0`*N4O@+`m{96u zc*c?b9{1I{KP1hG4z9DkB}VwbN#hHISMnOr58q{iGj{zP0AEOaBB%HxkK@}&E!NDH z&1BQ6?glxlC<{gxqqo}GLwak8VJm=+%b*?V4n(}?iA?nuehq%y%MAH|!JUA{j_U`b zp){ZG+o(=2yQcc5Fzx0KH|8eNRyNT;x;q>&I;~a9FO%08wmP`CAB#hRHwnsV)5@9C z#$Vf?G#i-~sJ^upSXkb)f~gi#x08Nfb#5SuqcZ}&L)hQqho&4O)|y`xO?efTMssTw zJWM!LhjErcLl%B`SbsKGMW{;C zEbSb;&mgRupK9DfslLk##anLLxxHvw>y2~b_)>A_tnf_r%#9F`VM{+ zH4s#h12TsCk1H3#sk3wbd|V#KFLfy((iP9of5Mnr%$-~;1h2gdr7J%#cao!fm0ISF zaKvJ*xhjeXLhMTRMd6U+Iea+rF(8}))f#zKa2w#=GwSp0oK|BFT02Gh{PJ7sn*yGX ztw7SIt#vbyQ;#Hlz5Kvv@~MM8tL00>i@HA1^K&F2g$tU{QD({_{Um?G!D5}?rK!U< zBODblh5)EKv;*YDiOaNfsSY z*S-rmolF7!`<2>u3FOK=fRk>GIx^n%j2w6x(Ytq9iuI}n;OOjJ992>TI}7zZug7WE zP8V)B2tGW_cH;BZhF72KX=rXf&1gqotz&3q;`!h}ExYQ*3j~-`Zi^%l(e&nuu`IT| zwRO_OfVW5vfvUD(oml!=@0GY4HI`S7vwg!_>xEp8*s_Li_XLKv?Z={$RP`0^^pV(T*#@I+IZX@XC@ z`zY--^K*5vrDI?!897@Xnt75;9OdL;|5tXN_Rdwbq=>sM|LfDqYZ?q9M(O-|9Z>*C z%|7355QO;#bB-fMQ3nO!40&cdzMjH8gOb!JxFO0OtE$@Bt|jVi$TlHGBLKZ=r?< z51Bfx-V{0EJy_VM<|GHes#_mxAbXiYJr>i#fSd#k7IMt?@}5L~a-Nm#Lh3kc{7by{c=-cCg714xsn;3w=$)V0*y8KGrM zsM`Fm3X9*FCQf=cV*l-|z6AGVUNQQteBx+#VQ9QuRFWmXU!*W?knq%g`LI1JWwQx` z(>-!7k*y(Cqy7@---(F9CB?Xviu&Aig%$(1C-R=qPuG;(=QR)tn?RS;%2Sep%E=Wc zfkJ9Ga02IX5UbpuVU`dS> z$Qz1Od{h=Lx(l#~m%r=cq9CUZP>+_3$O@eEl;u^leMCS-%mfaDez&)B-mwKKda7+ob4+q zSHc^v6z@LMfOel!T3$>P)mN6M(ad~7P%Y7EfC&F{A(FahQ8kWf5(%lhIq{jJ<(>eS zm=x;)DnEr;8T!I=Qk%^NuK&@#@PJ@i=u-NV^Znn2D6@C))ASF60xO$?g~yaETkUt0 z`SjQA$HQJp4!HiNQlC}EhS%BTLMS?Mkq2mVE^byGKjSNDU7u!;0}uR`8QEfosQwz2dxe} zfc|^ur>kk4Nnuxb#&5q`58{0qk)5SqP+R?)<0%_YRi)4yi$J++0={}`r@S4Ke0_}5 zZEUc9RwS2MsX$&^{CQJSD#D&3fAc=!76^_BvuCX*k3Q%JWrg-Zr-z#E@obAlOxaY; z(sk8Bq|k2e?uu%Dsl|M#%Z_Dz>K=i^Aek6HWHa_50gB@4p+%tS0i5 zI-2n6&)}FplC^{aqJ|{S#{g^+y&2GVJy^Pali+!2N$@PHe`>9j zxheU=x@R?jW7>G4s^G!w1K0avLSsLnpE?i}?&+%2ie_`-MNz~*Ap5d|#XKKe zlN_qx6PPwPr5<#Cu@E6wTk)GmtJRCpqY5W2!sn{x?pqv{?Djex_D11$NY_I^YM0LLM0zdEXjPI6prhe4A>_tC|PmAFw4n9l%^1#^3GE4(Ic>IFn>^WhHT} z;$n;@bxAYHjz0sfy_^$s4rY~6wb8z( z7uAzPF_IS>w(Zd7k~7@EtId#M61Q8kpUy$6YIejKHrSd`E81$gF)C%5-WT`Wx@XKJ#mj1oFxFmA76K$#3HZQ2ay6vRmW9j z0N9?5#^(TzWeW72XLD%O$|i`WexJUrPs@_=v#3!}pVXECuhk9gZ3%RTMyzbE^=$Vb z`M0Gn5wngpD(5Al6_m+1K;L8;HJ6tpMJr9Lz|ETZ!kr<(!TKa{@AbUHTk`-Y(}YTd zW9p)gXKi-Zf(2zr#IPvdG}dK{yMeN|MJdM%q~Vw>C^+L=Xv757yOypdY76e!8^}K_ zgAr)*lY9K~gjb(B0-YS4{*!Z6ei(=XV#s_fg?uxuOix)L%5(CgO?PagnLc9ia_iv2 zn~4c1K+@4O2h@-OGTty}nGamYU48GaPa0Z`Ax4?0iE7kWW(^~)wd}xaAX+c$)4!Ih z^k2VjhPewY2qMTF6)qEyTG?dF64U2-=-5-j>)?cZrQh)jNjlEwB<#sZ*(CY;o%-MD zQcl9krqZhCA`ZtN&uYa%-wiG9WAA1k1ck@~MmZO(jkngI1jC1$>SEcyJ? zp^M#xY6wjT30$vaZI@8Pj#86nI%>S2u&7&Ms_z%|9hfF`BmpZ|I`ts$=A+^PDqi!$>tYJ*I67jCRFN$?{U#JG^o#v-<6g>D5 zMQ$AP|TI1#(p1ls_j}5VIk|n`gOhOl*O% z)JMs*egE9d*ZGl_B28EN3y^-hdY!WyS+d%j>K0jBo@f&%Yd*1Wcl(wZC!t=D_9y`7 z`B+IUylwxpJRpLHAup2ijY(*c`)l&NrI@Fo6}}zdT{WP$-EN=aD+kbR?K8lrqUxoT@#4j3#NfJ{{P|Msr>^o07nJuqu*hCSl*u@fVIVy K3k^t*g#QC$jE}_t literal 0 HcmV?d00001 diff --git a/docs/_static/images/gensim-footer.png b/docs/_static/images/gensim-footer.png new file mode 100644 index 0000000000000000000000000000000000000000..80bfa7a67df3e1f8ed3ed3b58a107a27bbffd4ea GIT binary patch literal 7242 zcmV-Q9JS+#P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000qnNklt*JuDb&}geZ$@f6r5+{Ge6s{$(J7OIz!*QYebbdA(@qHv-Xk+}?VLvoqSvW4T*O@HzDUfn5;kS{}pDUFfB zNWGp@g&+^X1R1@gvNYI&W!MG)B#G|xI~F6=rqst=xdn3({->kxbYcG>gmUb~5e>{fy|?k-)ouVz-=sEz60-f8rRTkco$ZZ^orO`2WZjZH zk@Uy)DHZ?*5G|WBvK6D`afpwN@?M2xN3xKli;3=zR$F}tUmk2^8>5818XJX;6@%?r z4J0olp>F>!CJUbBmiNzrjlx8ZWSx^-Nk&yc-7$-uC4~?1KaSUzW9aSvi20#0k=LGA zeGI@hY_EUG{sI61|NoqnJx)V05QN8qjtY*z1!%YdiA2KzxC1>B6%rJ1AZU_;1LO=8 zD1Af)((}wm@$8rIQ(?*4l?#8nvtyUbr}e+4gro!oWF!X}P8ODD1|C)iP9jed^~?q1Yo z|F}IX`;ulL8Rmhdqie&1dzUn*C-AHnQJqr5!pUre=G4i`_OX-kg}RvpCNQKhE)DnR zW$)%0H6QG6K89tJc+n(Qby{Rolfzw!oh~;s z5ja7ly@Ia*M{ugt(4~c=b<;OIkWD)h>#*f zkdhA8!(g9`yUrH7&ScxEY&)$tt#aM!uXRkaj!FLRQ`p25HZjSz?PM3b`YE=2ifyxx zarl1rlkdL%XtH}IA~HMwHR-Ev&vhRg*eF>aRo(cIfCn`;sd#e*f`Rnlugp-RC;$OL z&L8-(DmD@vKOO(V@dsa+1}+p_IsV}Ism9v^|I&bQE&@(wl7Ya00sedl%q}sGf#~&O&3;e+hwE?$gn0xr<$Y19kf8ddMIU+G2`7O)v z)V!C(SFK~p_*vk;De$k%usW0eOZb=9-u|lewlM_*?hI%g`;D1B7Wj(*7K`W2ya4}8 z$3Fl70RR8Im`!dQM-YYI01mthKpsK+tjKkM0AmEmK39m~6G(uOYzzm{5zJk-IYE%o zDr@rqUWmSd1xcpZ^H-l2T|LtpjS|HUJPTHLb2wzZu2=6hKiT8_9~b_DVjsiDpg14a z$8L{D8&#kJ%G3=Eik{JbrOz46uDyHy&BHtOML@`sMq`rsc!-lVyBCp}To{m{tr^+e z@AXPbYvXs2oR92ZDk}%)jil9Ms%^UYX+V}Vuti$?&R2#?9!NZ!7lZkYjZ@~nAP2_B z#|9gNm7x-2OdcwrG^d+oyidRY=Ro=OtG^>izJY?v{V(4wb1%UJn2m$5ozlP)If||v zHNC0sY!g~5LTAOn&%?K^t@cgNZPRPt^xC({Z}j@mblaP{FK+5?c~f_~sykhUPFJBN z#p~!pbRF7r_aenjXp0YZ6Fo`YypF!4(QT-8Th}p$phE~T9)b?xpb)}oID{gEu&e8! zrmodAP1!b$u3vmx^j&-0b*=igRoAtPr$7I7k$O()W-48$ptFnyl|h-&VDLPTq(Nb( zs`s7rk}onEREElo28F>9=wglrz|M?kz|Je6GNa5?p%7F^<)9Fv5J{f!J{|9EUVbl0 z`s&4>#L9{9b-(^lJn4<|ffAAoEm8yg2O8`Qjxr#g^;y%K&|qPA`hh?DE)B*QX|PL& z4>J~EzX3nFQXLswI1M(MoQhI{4umowhQx=ptRnip%X*|A?+%>_xHMuCpc8`=lg`P84b3;dWHsb zYA_hKi5h$!4IWVi|H)?fzhkpfejQpFT1F5Mv3llcurcHK0U9Wy!QHaXlg`2TOd5QN z>m#*hkK4KtMd8Z_)j{kf*mWvt0}mjx19=HHkPXn)YXSt+66Ef+_7cQ0No6e{MVuX& zRRWW9=bRKXl!oKs)1RI9!bTk15HQ30@t$+8zp23FTe^-8Z{9;ShaGZrPZ1<6M9?)E zDCGiRZNtC&f`uSO{`%>MuV)*Mu@IYsaIzvPB`k&;j@OZrPTGjC=BF4R#=uaHi$^9! z-ed_Eo&`lO!8cQ0G z9r$c4^4@xM!Dnkxwib`A1zQDQ)UI9>^Hw3PvC^uQR#9|{qElORYS*1wF$yv2MtA=6 z-l(NfrBPj}su-hURF`Lq-}!y@8^8PI*ZWjFappI->ncQ~_V>#$!%ZM^PD7jLksFx(e|lbMe(s zc9t|2>@3-Bp0uxkVMR!*wvN`r3b9s$vMFlh@6o{AyJYny+yf8*^s0q8M7w+ zv=JOk-6s}2RcIA&A+!>R6dsFffF+5G2$3bpyWt_o-u~>hAHy)8QSbreJP=xC@ZPBQ z5L$D9Hwoc&kkAUcNEvmJ1&KRfy`_*<%9+R2afnGxttZCv2EuuONCk54gRF}YL^eSe zz-y2XaQdMHSp|qJK;G_-D+VvnoE{;+nYFlJ`!GbJ=px*F__I+<&;gC#R30EQ-Qh(p z`>4VrvKm3;_J}TWMe;c~gw?T#qz+|ocikz(E6!_BmJt#QkYxgq29#Nx-$aOHM+&Wm zwP1iq;j1U?BIQUIS-VLBFF?+NLs%pb$-+a4x=5Bl>F`T zUK9o3-VrYA6^?X~=8e3_$z9~XNF67g+8W^6RmN+r5gfw#uJr#Tp><*xd5?n;kTX(p zkgEhDwOtG6`lS9YNgA z&OAXt9btHaz&yfm6JTP;*2|)sWU<-Jzo8?;69NXLZc>)rkM;GdD(Rx_A}{HXtt;XV zu60^3er=)JDv^BtmVNF zLsv9nfyLsx$2wwRcfR|)S=h7T>CMOXdHXf8=u0DV&5c-BuT>bb(}9LCs+qPh+T$|v zmc0U6rYm%qx?;{zuqg^eU1mulPAZ)vf6IGER0(flC zTP&I?CT#xt^~bzVG#P+!!GK^B&0Y#}CQeck8v`d9h;TuiYzZdfx{yS+5Kh(vsw8Fe zzPmVCld6ppWXAeDGg@>7()4cG=8f8bh|0BVYdJH_Ho zN&+kBmI=|PAJ>+&ixZ#Zj;I!^cb`!bT#+aZocN?pINRMxsQU4N8b@|_k{j-%AhDrB zMr6SWK>F2nJviwVi@?c=)d%gHsBr@&{MI4}F{A)DUw&`E^7ehEDPT#C5s{2Ep59-$ zjzkJZyiQ5*8tRVsN4S%y$DM4e9vcfzHUvI9aIzzK7~xJ@uP-oBXiS775OdHXwYihb za3?9qoJ6V+_v|=1SRzQGf`Q!dQr^^^E|>cc>-f80{@69YM{XM0?kN~>C+UDYNz}%0 z(47Q5?&Nl+JMjnxWOJuGl3nEj?j+Wc;ixv$y*P=~M;Ea-1aMN7r>Z(6GQ8t)Vyzb# zIB^L@4B4%dY7U{H1EaFd;bfQh!joOzlF2TIJE^WqNv8Ur9;(mK=mq^uC%BUw>SHV(p*E6D-&rqC5^Y~| zhd@&8PTFEn=N3KgBt?~~@4Ayh#EBfNzP^s3+5jU0=#9Wh0Wei!M`1*W`uAHzAitn5 zrE#7(TwmlD&(Or+HE(|S_-Al#&|pT51BtlDodg6v^|+Ha6Wz&DII%dA%ej+F<77_H zVsE7R`|&B)o7BjHlbz0L9&`;P*HI^;O7VL=?j-(7cd}&d8jh=n$0wPt_ekz^ooFgfN|G^&n+a07*qoM6N<$f;NV^LI3~& literal 0 HcmV?d00001 diff --git a/docs/_static/images/gensim.png b/docs/_static/images/gensim.png new file mode 100644 index 0000000000000000000000000000000000000000..72701bcb4f15cf624e680f842bc0658e96f6e94d GIT binary patch literal 25785 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/gensim_compact.png b/docs/_static/images/gensim_compact.png new file mode 100644 index 0000000000000000000000000000000000000000..908968c5515afc1a2aa381b99772a048bf4c301d GIT binary patch literal 18280 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/get-started.png b/docs/_static/images/get-started.png new file mode 100644 index 0000000000000000000000000000000000000000..38c7297524192354a2aeed1515be836cc4d31ca9 GIT binary patch literal 26520 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 DP4^T8 literal 0 HcmV?d00001 diff --git a/docs/_static/images/googlegroups.png b/docs/_static/images/googlegroups.png new file mode 100644 index 0000000000000000000000000000000000000000..719c37c04499b84a8e01d3ce1d9de984aa335c66 GIT binary patch literal 5513 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 D?d&fs literal 0 HcmV?d00001 diff --git a/docs/_static/images/logo-gensim.png b/docs/_static/images/logo-gensim.png new file mode 100644 index 0000000000000000000000000000000000000000..738041df57243dc88f099fd23caa856dc6476b40 GIT binary patch literal 23359 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 NxGUohq$LUf06T;Do1y>! literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_dynadmic.png b/docs/_static/images/references/logo_dynadmic.png new file mode 100644 index 0000000000000000000000000000000000000000..6b862b7e1edb7497978cb87d7a484d0527505849 GIT binary patch literal 14396 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_eudml.png b/docs/_static/images/references/logo_eudml.png new file mode 100644 index 0000000000000000000000000000000000000000..7c266bffaa14e176ef7cc2ec910407be2b3acdba GIT binary patch literal 9669 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 Hu0mjf^9*Nd literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_ghent.png b/docs/_static/images/references/logo_ghent.png new file mode 100644 index 0000000000000000000000000000000000000000..1f0a683b011a95dd6f874d222c7c4f1378a14f1b GIT binary patch literal 4993 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 YCJlAc2}1$De~M|UK2)iA@Fe7a0F%}p7ytkO literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_ibcn.png b/docs/_static/images/references/logo_ibcn.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ca533bf3431f5d6161eb4c8037625d41a1c337 GIT binary patch literal 38342 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_issuu.jpeg b/docs/_static/images/references/logo_issuu.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..34955b1e53aaf9cf8207479429dad8fb5c07906e GIT binary patch literal 3946 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_roistr.png b/docs/_static/images/references/logo_roistr.png new file mode 100644 index 0000000000000000000000000000000000000000..4be07bceee0bd0d88bdc1339d92ebdd8f8ccc259 GIT binary patch literal 71879 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 VtLL~oVbK5p002ovPDHLkV1iX;Hh=&C literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_sportsauthority.png b/docs/_static/images/references/logo_sportsauthority.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbe8ae11218f7812e433f050ca37a89a5a2f150 GIT binary patch literal 4211 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 JPDHLkV1frFijM#Q literal 0 HcmV?d00001 diff --git a/docs/_static/images/references/logo_tailwind.png b/docs/_static/images/references/logo_tailwind.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e1a28b00fd85371b819acb893da026650f6f0a GIT binary patch literal 55890 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 LHTfJ_lXw3QduNT% literal 0 HcmV?d00001 diff --git a/docs/_static/images/tagline.png b/docs/_static/images/tagline.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0f8567daa4935e526f797be2cd2ba4d9095869 GIT binary patch literal 4820 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/ukazka.png b/docs/_static/images/ukazka.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe2e18f8301bdecda6b2f5aefdc0a8732c837d7 GIT binary patch literal 17894 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

XKZs_4>~hgU15)AGDAx`YVo2vD12q_9P|)lypLu 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/ukazka2.png b/docs/_static/images/ukazka2.png new file mode 100644 index 0000000000000000000000000000000000000000..41b8ab9b105509d967dd221fe106b6c08626c749 GIT binary patch literal 17463 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 LRHe%#pZfm~w!tXk literal 0 HcmV?d00001 diff --git a/docs/_static/no_image.png b/docs/_static/no_image.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2d48d5d3f0044cf0399b3608d8eb5db6f9d12d GIT binary patch literal 4315 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 HW8D7$6^1w` literal 0 HcmV?d00001 diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css new file mode 100644 index 0000000000..20c4814dcf --- /dev/null +++ b/docs/_static/pygments.css @@ -0,0 +1,69 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file From 6e9d372c2ee2c772ad6073f189dce24d37beda4d Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 19:49:39 +0300 Subject: [PATCH 11/42] Add js --- docs/_static/js/jquery-1.9.1.min.js | 5 +++++ docs/_static/js/jquery-migrate-1.1.1.min.js | 3 +++ docs/_static/js/jquery.anythingslider.min.js | 6 ++++++ docs/_static/js/jquery.qtip.min.js | 2 ++ 4 files changed, 16 insertions(+) create mode 100644 docs/_static/js/jquery-1.9.1.min.js create mode 100644 docs/_static/js/jquery-migrate-1.1.1.min.js create mode 100644 docs/_static/js/jquery.anythingslider.min.js create mode 100644 docs/_static/js/jquery.qtip.min.js diff --git a/docs/_static/js/jquery-1.9.1.min.js b/docs/_static/js/jquery-1.9.1.min.js new file mode 100644 index 0000000000..006e953102 --- /dev/null +++ b/docs/_static/js/jquery-1.9.1.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="

a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("'),u.bgiframe.appendTo(c),c.bind("tooltipmove"+h,o.adjustBGIFrame)),m=r("
",{id:"qtip-rcontainer"}).appendTo(t.body),o.redraw(),u.overlay&&!v&&(s=function(){u.overlay[0].style.top=n.scrollTop()+"px"},n.bind("scroll.qtip-ie6, resize.qtip-ie6",s),s(),u.overlay.addClass("qtipmodal-ie6fix"),v=i)},adjustBGIFrame:function(){var e=n.get("dimensions"),t=n.plugins.tip,r=u.tip,i,s;s=parseInt(c.css("border-left-width"),10)||0,s={left:-s,top:-s},t&&r&&(i=t.corner.precedance==="x"?["width","left"]:["height","top"],s[i[1]]-=r[i[0]]()),u.bgiframe.css(s).css(e)},redraw:function(){if(n.rendered<1||d)return o;var e=a.style,t=a.position.container,r,i,s,u;return d=1,e.height&&c.css(l,e.height),e.width?c.css(f,e.width):(c.css(f,"").appendTo(m),i=c.width(),i%2<1&&(i+=1),s=c.css("max-width")||"",u=c.css("min-width")||"",r=(s+u).indexOf("%")>-1?t.width()/100:0,s=(s.indexOf("%")>-1?r:1)*parseInt(s,10)||i,u=(u.indexOf("%")>-1?r:1)*parseInt(u,10)||0,i=s+u?Math.min(Math.max(i,u),s):i,c.css(f,Math.round(i)).appendTo(t)),d=0,o},destroy:function(){p&&u.bgiframe.remove(),c.unbind(h)}}),o.init()}var i=!0,s=!1,o=null,u="x",a="y",f="width",l="height",c="top",h="left",p="bottom",d="right",v="center",m="flip",g="flipinvert",y="shift",b,w,E,S="qtip",x={},T=["ui-widget","ui-tooltip"],N="div.qtip."+S,C=S+"-default",k=S+"-focus",L=S+"-hover",A="_replacedByqTip",O="oldtitle",M;b=r.fn.qtip=function(e,t,u){var a=(""+e).toLowerCase(),f=o,l=r.makeArray(arguments).slice(1),c=l[l.length-1],h=this[0]?r.data(this[0],"qtip"):o;if(!arguments.length&&h||a==="api")return h;if("string"==typeof e)return this.each(function(){var e=r.data(this,"qtip");if(!e)return i;c&&c.timeStamp&&(e.cache.event=c);if(a!=="option"&&a!=="options"||!t)e[a]&&e[a].apply(e[a],l);else{if(!r.isPlainObject(t)&&u===n)return f=e.get(t),s;e.set(t,u)}}),f!==o?f:this;if("object"==typeof e||!arguments.length)return h=D(r.extend(i,{},e)),b.bind.call(this,h,c)},b.bind=function(e,t){return this.each(function(o){function p(e){function t(){c.render(typeof e=="object"||u.show.ready),a.show.add(a.hide).unbind(l)}if(c.cache.disabled)return s;c.cache.event=r.extend({},e),c.cache.target=e?r(e.target):[n],u.show.delay>0?(clearTimeout(c.timers.show),c.timers.show=setTimeout(t,u.show.delay),f.show!==f.hide&&a.hide.bind(f.hide,function(){clearTimeout(c.timers.show)})):t()}var u,a,f,l,c,h;h=r.isArray(e.id)?e.id[o]:e.id,h=!h||h===s||h.length<1||x[h]?b.nextid++:x[h]=h,l=".qtip-"+h+"-create",c=H.call(this,h,e);if(c===s)return i;u=c.options,r.each(w,function(){this.initialize==="initialize"&&this(c)}),a={show:u.show.target,hide:u.hide.target},f={show:r.trim(""+u.show.event).replace(/ /g,l+" ")+l,hide:r.trim(""+u.hide.event).replace(/ /g,l+" ")+l},/mouse(over|enter)/i.test(f.show)&&!/mouse(out|leave)/i.test(f.hide)&&(f.hide+=" mouseleave"+l),a.show.bind("mousemove"+l,function(e){_(e),c.cache.onTarget=i}),a.show.bind(f.show,p),(u.show.ready||u.prerender)&&p(t)}).attr("data-hasqtip",i)},w=b.plugins={Corner:function(e){e=(""+e).replace(/([A-Z])/," $1").replace(/middle/gi,v).toLowerCase(),this.x=(e.match(/left|right/i)||e.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(e.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase();var t=e.charAt(0);this.precedance=t==="t"||t==="b"?a:u,this.string=function(){return this.precedance===a?this.y+this.x:this.x+this.y},this.abbrev=function(){var e=this.x.substr(0,1),t=this.y.substr(0,1);return e===t?e:this.precedance===a?t+e:e+t},this.invertx=function(e){this.x=this.x===h?d:this.x===d?h:e||this.x},this.inverty=function(e){this.y=this.y===c?p:this.y===p?c:e||this.y},this.clone=function(){return{x:this.x,y:this.y,precedance:this.precedance,string:this.string,abbrev:this.abbrev,clone:this.clone,invertx:this.invertx,inverty:this.inverty}}},offset:function(e,n){function c(e,t){i.left+=t*e.scrollLeft(),i.top+=t*e.scrollTop()}var i=e.offset(),s=e.closest("body"),o=r.browser.msie&&t.compatMode!=="CSS1Compat",u=n,a,f,l;if(u){do u.css("position")!=="static"&&(f=u.position(),i.left-=f.left+(parseInt(u.css("borderLeftWidth"),10)||0)+(parseInt(u.css("marginLeft"),10)||0),i.top-=f.top+(parseInt(u.css("borderTopWidth"),10)||0)+(parseInt(u.css("marginTop"),10)||0),!a&&(l=u.css("overflow"))!=="hidden"&&l!=="visible"&&(a=u));while((u=r(u[0].offsetParent)).length);(a&&a[0]!==s[0]||o)&&c(a||s,1)}return i},iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||s,fn:{attr:function(e,t){if(this.length){var n=this[0],i="title",s=r.data(n,"qtip");if(e===i&&s&&"object"==typeof s&&s.options.suppress)return arguments.length<2?r.attr(n,O):(s&&s.options.content.attr===i&&s.cache.attr&&s.set("content.text",t),this.attr(O,t))}return r.fn["attr"+A].apply(this,arguments)},clone:function(e){var t=r([]),n="title",i=r.fn["clone"+A].apply(this,arguments);return e||i.filter("["+O+"]").attr("title",function(){return r.attr(this,O)}).removeAttr(O),i}}},r.each(w.fn,function(e,t){if(!t||r.fn[e+A])return i;var n=r.fn[e+A]=r.fn[e];r.fn[e]=function(){return t.apply(this,arguments)||n.apply(this,arguments)}}),r.ui||(r["cleanData"+A]=r.cleanData,r.cleanData=function(e){for(var t=0,i;(i=e[t])!==n;t++)try{r(i).triggerHandler("removeqtip")}catch(s){}r["cleanData"+A](e)}),b.version="2.0.0-nightly-15f5c6bc20",b.nextid=0,b.inactiveEvents="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),b.zindex=15e3,b.defaults={prerender:s,id:s,overwrite:i,suppress:i,content:{text:i,attr:"title",deferred:s,title:{text:s,button:s}},position:{my:"top left",at:"bottom right",target:s,container:s,viewport:s,adjust:{x:0,y:0,mouse:i,resize:i,method:"flipinvert flipinvert"},effect:function(e,t,n){r(this).animate(t,{duration:200,queue:s})}},show:{target:s,event:"mouseenter",effect:i,delay:90,solo:s,ready:s,autofocus:s},hide:{target:s,event:"mouseleave",effect:i,delay:0,fixed:s,inactive:s,leave:"window",distance:s},style:{classes:"",widget:s,width:s,height:s,def:i},events:{render:o,move:o,show:o,hide:o,toggle:o,visible:o,hidden:o,focus:o,blur:o}},w.svg=function(e,n,i,s){var o=r(t),u=n[0],a={width:0,height:0,position:{top:1e10,left:1e10}},f,l,c,h,p;while(!u.getBBox)u=u.parentNode;if(u.getBBox&&u.parentNode){f=u.getBBox(),l=u.getScreenCTM(),c=u.farthestViewportElement||u;if(!c.createSVGPoint)return a;h=c.createSVGPoint(),h.x=f.x,h.y=f.y,p=h.matrixTransform(l),a.position.left=p.x,a.position.top=p.y,h.x+=f.width,h.y+=f.height,p=h.matrixTransform(l),a.width=p.x-a.position.left,a.height=p.y-a.position.top,a.position.left+=o.scrollLeft(),a.position.top+=o.scrollTop()}return a},w.ajax=function(e){var t=e.plugins.ajax;return"object"==typeof t?t:e.plugins.ajax=new B(e)},w.ajax.initialize="render",w.ajax.sanitize=function(e){var t=e.content,n;t&&"ajax"in t&&(n=t.ajax,typeof n!="object"&&(n=e.content.ajax={url:n}),"boolean"!=typeof n.once&&n.once&&(n.once=!!n.once))},r.extend(i,b.defaults,{content:{ajax:{loading:i,once:i}}}),w.tip=function(e){var t=e.plugins.tip;return"object"==typeof t?t:e.plugins.tip=new F(e)},w.tip.initialize="render",w.tip.sanitize=function(e){var t=e.style,n;t&&"tip"in t&&(n=e.style.tip,typeof n!="object"&&(e.style.tip={corner:n}),/string|boolean/i.test(typeof n.corner)||(n.corner=i),typeof n.width!="number"&&delete n.width,typeof n.height!="number"&&delete n.height,typeof n.border!="number"&&n.border!==i&&delete n.border,typeof n.offset!="number"&&delete n.offset)},r.extend(i,b.defaults,{style:{tip:{corner:i,mimic:s,width:6,height:6,border:i,offset:0}}}),w.modal=function(e){var t=e.plugins.modal;return"object"==typeof t?t:e.plugins.modal=new I(e)},w.modal.initialize="render",w.modal.sanitize=function(e){e.show&&(typeof e.show.modal!="object"?e.show.modal={on:!!e.show.modal}:typeof e.show.modal.on=="undefined"&&(e.show.modal.on=i))},w.modal.zindex=b.zindex-200,w.modal.focusable=["a[href]","area[href]","input","select","textarea","button","iframe","object","embed","[tabindex]","[contenteditable]"],r.extend(i,b.defaults,{show:{modal:{on:s,effect:i,blur:i,stealfocus:i,escape:i}}}),w.viewport=function(n,r,i,s,o,m,b){function j(e,t,n,i,s,o,u,a,f){var l=r[s],c=x[e],h=T[e],p=n===y,d=-O.offset[s]+A.offset[s]+A["scroll"+s],m=c===s?f:c===o?-f:-f/2,b=h===s?a:h===o?-a:-a/2,w=_&&_.size?_.size[u]||0:0,E=_&&_.corner&&_.corner.precedance===e&&!p?w:0,S=d-l+E,N=l+f-A[u]-d+E,C=m-(x.precedance===e||c===x[t]?b:0)-(h===v?a/2:0);return p?(E=_&&_.corner&&_.corner.precedance===t?w:0,C=(c===s?1:-1)*m-E,r[s]+=S>0?S:N>0?-N:0,r[s]=Math.max(-O.offset[s]+A.offset[s]+(E&&_.corner[e]===v?_.offset:0),l-C,Math.min(Math.max(-O.offset[s]+A.offset[s]+A[u],l+C),r[s]))):(i*=n===g?2:0,S>0&&(c!==s||N>0)?(r[s]-=C+i,H["invert"+e](s)):N>0&&(c!==o||S>0)&&(r[s]-=(c===v?-C:C)+i,H["invert"+e](o)),r[s]N&&(r[s]=l,H=x.clone())),r[s]-l}var w=i.target,E=n.elements.tooltip,x=i.my,T=i.at,N=i.adjust,C=N.method.split(" "),k=C[0],L=C[1]||C[0],A=i.viewport,O=i.container,M=n.cache,_=n.plugins.tip,D={left:0,top:0},P,H,B;if(!A.jquery||w[0]===e||w[0]===t.body||N.method==="none")return D;P=E.css("position")==="fixed",A={elem:A,height:A[(A[0]===e?"h":"outerH")+"eight"](),width:A[(A[0]===e?"w":"outerW")+"idth"](),scrollleft:P?0:A.scrollLeft(),scrolltop:P?0:A.scrollTop(),offset:A.offset()||{left:0,top:0}},O={elem:O,scrollLeft:O.scrollLeft(),scrollTop:O.scrollTop(),offset:O.offset()||{left:0,top:0}};if(k!=="shift"||L!=="shift")H=x.clone();return D={left:k!=="none"?j(u,a,k,N.x,h,d,f,s,m):0,top:L!=="none"?j(a,u,L,N.y,c,p,l,o,b):0},H&&M.lastClass!==(B=S+"-pos-"+H.abbrev())&&E.removeClass(n.cache.lastClass).addClass(n.cache.lastClass=B),D},w.imagemap=function(e,t,n,i){function E(e,t,n){var r=0,i=1,s=1,o=0,u=0,a=e.width,f=e.height;while(a>0&&f>0&&i>0&&s>0){a=Math.floor(a/2),f=Math.floor(f/2),n.x===h?i=a:n.x===d?i=e.width-a:i+=Math.floor(a/2),n.y===c?s=f:n.y===p?s=e.height-f:s+=Math.floor(f/2),r=t.length;while(r--){if(t.length<2)break;o=t[r][0]-e.position.left,u=t[r][1]-e.position.top,(n.x===h&&o>=i||n.x===d&&o<=i||n.x===v&&(oe.width-i)||n.y===c&&u>=s||n.y===p&&u<=s||n.y===v&&(ue.height-s))&&t.splice(r,1)}}return{left:t[0][0],top:t[0][1]}}t.jquery||(t=r(t));var s=e.cache.areas={},o=(t[0].shape||t.attr("shape")).toLowerCase(),u=t[0].coords||t.attr("coords"),a=u.split(","),f=[],l=r('img[usemap="#'+t.parent("map").attr("name")+'"]'),m=l.offset(),g={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10}},y=0,b=0,w;m.left+=Math.ceil((l.outerWidth()-l.width())/2),m.top+=Math.ceil((l.outerHeight()-l.height())/2);if(o==="poly"){y=a.length;while(y--)b=[parseInt(a[--y],10),parseInt(a[y+1],10)],b[0]>g.position.right&&(g.position.right=b[0]),b[0]g.position.bottom&&(g.position.bottom=b[1]),b[1] Date: Mon, 19 Feb 2018 20:17:39 +0300 Subject: [PATCH 12/42] Restore .html --- .gitignore | 2 +- docs/_static/broken_example.png | Bin 21404 -> 0 bytes docs/_static/gallery.css | 192 ------------------------ docs/_static/no_image.png | Bin 4315 -> 0 bytes docs/_static/pygments.css | 69 --------- docs/_templates/indexcontent.html | 179 +++++++++++++++++++++++ docs/gensim_theme/domainindex.html | 56 +++++++ docs/gensim_theme/genindex.html | 77 ++++++++++ docs/gensim_theme/layout.html | 226 +++++++++++++++++++++++++++++ docs/gensim_theme/page.html | 4 + docs/gensim_theme/search.html | 56 +++++++ 11 files changed, 599 insertions(+), 262 deletions(-) delete mode 100644 docs/_static/broken_example.png delete mode 100644 docs/_static/gallery.css delete mode 100644 docs/_static/no_image.png delete mode 100644 docs/_static/pygments.css create mode 100644 docs/_templates/indexcontent.html create mode 100644 docs/gensim_theme/domainindex.html create mode 100644 docs/gensim_theme/genindex.html create mode 100644 docs/gensim_theme/layout.html create mode 100644 docs/gensim_theme/page.html create mode 100644 docs/gensim_theme/search.html diff --git a/.gitignore b/.gitignore index 9a34bd7ff6..535eaef653 100644 --- a/.gitignore +++ b/.gitignore @@ -71,7 +71,7 @@ data *.model *~ *_out.txt -*.html +docs/*.html *.inv *.js docs/_images/ diff --git a/docs/_static/broken_example.png b/docs/_static/broken_example.png deleted file mode 100644 index 4fea24e7df4781c2c32c8d7995511ac89e953145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21404 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 HW8D7$6^1w` diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css deleted file mode 100644 index 20c4814dcf..0000000000 --- a/docs/_static/pygments.css +++ /dev/null @@ -1,69 +0,0 @@ -.highlight .hll { background-color: #ffffcc } -.highlight { background: #eeffcc; } -.highlight .c { color: #408090; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #007020; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #007020 } /* Comment.Preproc */ -.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #333333 } /* Generic.Output */ -.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0044DD } /* Generic.Traceback */ -.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #007020 } /* Keyword.Pseudo */ -.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #902000 } /* Keyword.Type */ -.highlight .m { color: #208050 } /* Literal.Number */ -.highlight .s { color: #4070a0 } /* Literal.String */ -.highlight .na { color: #4070a0 } /* Name.Attribute */ -.highlight .nb { color: #007020 } /* Name.Builtin */ -.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ -.highlight .no { color: #60add5 } /* Name.Constant */ -.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #007020 } /* Name.Exception */ -.highlight .nf { color: #06287e } /* Name.Function */ -.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ -.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #bb60d5 } /* Name.Variable */ -.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mb { color: #208050 } /* Literal.Number.Bin */ -.highlight .mf { color: #208050 } /* Literal.Number.Float */ -.highlight .mh { color: #208050 } /* Literal.Number.Hex */ -.highlight .mi { color: #208050 } /* Literal.Number.Integer */ -.highlight .mo { color: #208050 } /* Literal.Number.Oct */ -.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ -.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ -.highlight .sc { color: #4070a0 } /* Literal.String.Char */ -.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ -.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ -.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ -.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ -.highlight .sx { color: #c65d09 } /* Literal.String.Other */ -.highlight .sr { color: #235388 } /* Literal.String.Regex */ -.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ -.highlight .ss { color: #517918 } /* Literal.String.Symbol */ -.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #06287e } /* Name.Function.Magic */ -.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ -.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ -.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ -.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ -.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_templates/indexcontent.html b/docs/_templates/indexcontent.html new file mode 100644 index 0000000000..f8c8de67d1 --- /dev/null +++ b/docs/_templates/indexcontent.html @@ -0,0 +1,179 @@ +{% extends "layout.html" %} + +{% set title = _('Topic modelling for humans') %} + +{% block header %} +
+

gensim

+ +
+
+
gensim
+
gensim tagline
+
+ + + +
+
+{% endblock %} + + +{% block document %} + + +
+ + Fork me on GitHub + + +
+ +
+
+ +
+ gensim code example +
+ +
+ Gensim is a FREE Python library +
    +
  • Scalable statistical semantics
  • +
  • Analyze plain-text documents for semantic structure
  • +
  • Retrieve semantically similar documents
  • +
+
+
+
+ +
+
+

Features
Hover your mouse over each feature for more info.

+ + + +
+
+
+ robustRobust +
+ +
+
+ +
+ supportSupport +
+
+
+ +
+
+
+ +
+
+

Who is using Gensim?
Doing something interesting with gensim? Ask to be featured here.

+ +
+
    +
  • + “Here at Tailwind, we use Gensim to help our customers post interesting and relevant content to Pinterest. No fuss, no muss. Just fast, scalable language processing.” Waylon Flinn, Tailwind +
  • +
  • + “We are using gensim every day. Over 15 thousand times per day to be precise. Gensim’s LDA module lies at the very core of the analysis we perform on each uploaded publication to figure out what it’s all about. It simply works.” Andrius Butkus, Issuu +
  • +
  • + “Gensim hits the sweetest spot of being a simple yet powerful way to access some incredibly complex NLP goodness.” Alan J. Salmoni, Roistr.com +
  • +
  • + “I used gensim at Ghent university. I found it easy to build prototypes with various models, extend it with additional features and gain empirical insights quickly. It's a reliable library that can be used beyond prototyping too.” Dieter Plaetinck, IBCN group +
  • +
  • + “We used gensim in several text mining projects at Sports Authority. The data were from free-form text fields in customer surveys, as well as social media sources. Having gensim significantly sped our time to development, and it is still my go-to package for topic modeling with large retail data sets.” Josh Hemann, Sports Authority +
  • +
  • + “Semantic analysis is a hot topic in online marketing, but there are few products on the market that are truly powerful. +Gensim is undoubtedly one of the best frameworks that efficiently implement algorithms for statistical analysis. +Few products, even commercial, have this level of quality.” Bruno Champion, DynAdmic +
  • + +
  • + “Based on our experience with gensim on DML-CZ, we naturally opted to use it on a much bigger scale for similarity +of fulltexts of scientific papers in the European Digital Mathematics Library. In evaluation with other approaches, gensim became a clear winner, especially because of speed, scalability and ease of use.”Petr Sojka, EuDML +
  • +
  • + “We have been using gensim in several DTU courses related to digital media engineering and find it immensely useful as the tutorial material provides students an excellent introduction to quickly understand the underlying principles in topic modeling based on both LSA and LDA.”Michael Kai Petersen, Technical University of Denmark +
  • + +
+
+ +
+
+
+ +
+ get started +
+{% endblock %} diff --git a/docs/gensim_theme/domainindex.html b/docs/gensim_theme/domainindex.html new file mode 100644 index 0000000000..947a01ea8e --- /dev/null +++ b/docs/gensim_theme/domainindex.html @@ -0,0 +1,56 @@ +{# + basic/domainindex.html + ~~~~~~~~~~~~~~~~~~~~~~ + + Template for domain indices (module index, ...). + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{% extends "layout.html" %} +{% set title = indextitle %} +{% block extrahead %} +{{ super() }} +{% if not embedded and collapse_index %} + +{% endif %} +{% endblock %} +{% block body %} + + {%- set groupid = idgen() %} + +

{{ indextitle }}

+ +
+ {%- for (letter, entries) in content %} + {{ letter }} + {%- if not loop.last %} | {% endif %} + {%- endfor %} +
+ +
+ {%- for letter, entries in content %} + + + {%- for (name, grouptype, page, anchor, extra, qualifier, description) + in entries %} + + + + {%- endfor %} + {%- endfor %} +
 
+ {{ letter }}
{% if grouptype == 1 -%} + + {%- endif %}{% if grouptype == 2 %}   {% endif %} + {% if page %}{% endif -%} + {{ name|e }} + {%- if page %}{% endif %} + {%- if extra %} ({{ extra|e }}){% endif -%} + {% if qualifier %}{{ qualifier|e }}:{% endif %} + {{ description|e }}
+ +{% endblock %} diff --git a/docs/gensim_theme/genindex.html b/docs/gensim_theme/genindex.html new file mode 100644 index 0000000000..9406bc5000 --- /dev/null +++ b/docs/gensim_theme/genindex.html @@ -0,0 +1,77 @@ +{# + basic/genindex.html + ~~~~~~~~~~~~~~~~~~~ + + Template for an "all-in-one" index. + + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{% macro indexentries(firstname, links) %} +
+ {%- if links -%} + + {%- if links[0][0] %}{% endif -%} + {{ firstname|e }} + {%- if links[0][0] %}{% endif -%} + + + {%- for ismain, link in links[1:] -%} + , {% if ismain %}{% endif -%} + [{{ loop.index }}] + {%- if ismain %}{% endif -%} + + {%- endfor %} + {%- else %} + {{ firstname|e }} + {%- endif %} +
+{% endmacro %} + +{% extends "layout.html" %} +{% set title = _('Index') %} +{% block body %} + +

{{ _('Index') }}

+ +
+ {% for key, dummy in genindexentries -%} + {{ key }} + {% if not loop.last %}| {% endif %} + {%- endfor %} +
+ +{%- for key, entries in genindexentries %} +

{{ key }}

+ + {%- for column in entries|slice(2) if column %} + + {%- endfor %} +
+ {%- for entryname, (links, subitems, _) in column %} + {{ indexentries(entryname, links) }} + {%- if subitems %} +
+ {%- for subentryname, subentrylinks in subitems %} + {{ indexentries(subentryname, subentrylinks) }} + {%- endfor %} +
+ {%- endif -%} + {%- endfor %} +
+{% endfor %} + +{% endblock %} + +{% block sidebarrel %} +{% if split_index %} +

{{ _('Index') }}

+

{% for key, dummy in genindexentries -%} + {{ key }} + {% if not loop.last %}| {% endif %} + {%- endfor %}

+ +

{{ _('Full index on one page') }}

+{% endif %} + {{ super() }} +{% endblock %} diff --git a/docs/gensim_theme/layout.html b/docs/gensim_theme/layout.html new file mode 100644 index 0000000000..feac733791 --- /dev/null +++ b/docs/gensim_theme/layout.html @@ -0,0 +1,226 @@ +{%- block doctype -%} + +{%- endblock %} + +{% set script_files = ["_static/js/jquery-1.9.1.min.js", "_static/js/jquery.qtip.min.js", "_static/js/jquery-migrate-1.1.1.min.js", "_static/js/jquery.anythingslider.min.js"] %} +{% set css_files = css_files + ["_static/css/jquery.qtip.min.css", "_static/css/anythingslider.css"] %} +{%- set url_root = pathto('', 1) %} + +{%- macro script() %} + + + {%- for scriptfile in script_files %} + + {%- endfor %} +{%- endmacro %} + +{%- macro css() %} + + {%- for cssfile in css_files %} + + {%- endfor %} + +{%- endmacro %} + + + + + + + + + + + + + {{ metatags }} + {%- block htmltitle %} + gensim: {{ title|striptags|e }} + {%- endblock %} + + {{ css() }} + + + + + + + + + + +
+ {% block header %} +
+
+

+ gensim logo +

+
+ +
+
+
gensim
+
gensim tagline
+
+
+
+

Get Expert Help From The Gensim Authors

+

Consulting in Machine Learning & NLP

+

• Commercial document similarity engine: ScaleText.ai

+

Corporate trainings in Python Data Science and Deep Learning

+
+
+
+
+ {% endblock %} + + {% block navbar %} + + {% endblock %} + +
+
+ + {{ script() }} + + {% block content %} +
+ {% block document %} +
+
+ {{ title|striptags|e }} +
+
+
+
+ {% block body %} {% endblock %} +
+
+ {% endblock %} + +
+
+ {% endblock %} + + {% block footer %} + + {% endblock %} + + + + + diff --git a/docs/gensim_theme/page.html b/docs/gensim_theme/page.html new file mode 100644 index 0000000000..17a9301653 --- /dev/null +++ b/docs/gensim_theme/page.html @@ -0,0 +1,4 @@ +{% extends "layout.html" %} +{% block body %} + {{ body }} +{% endblock %} diff --git a/docs/gensim_theme/search.html b/docs/gensim_theme/search.html new file mode 100644 index 0000000000..4cdc6935c0 --- /dev/null +++ b/docs/gensim_theme/search.html @@ -0,0 +1,56 @@ +{# + basic/search.html + ~~~~~~~~~~~~~~~~~ + + Template for the search page. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{% extends "layout.html" %} +{% set title = _('Search') %} +{% set script_files = script_files + ['_static/searchtools.js'] %} +{% block extrahead %} + + {{ super() }} +{% endblock %} +{% block body %} +

{{ _('Search') }}

+
+ +

+ {% trans %}Please activate JavaScript to enable the search + functionality.{% endtrans %} +

+
+

+ {% trans %}From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list.{% endtrans %} +

+
+ + + +
+ {% if search_performed %} +

{{ _('Search Results') }}

+ {% if not search_results %} +

{{ _('Your search did not match any results.') }}

+ {% endif %} + {% endif %} +
+ {% if search_results %} +
    + {% for href, caption, context in search_results %} +
  • {{ caption }} +
    {{ context|e }}
    +
  • + {% endfor %} +
+ {% endif %} +
+{% endblock %} From 695b4529fd6c5297a80edd1f8635df9be808afe6 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 20:28:42 +0300 Subject: [PATCH 13/42] Make an exception for _static/js in .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 535eaef653..f15a3826e3 100644 --- a/.gitignore +++ b/.gitignore @@ -74,4 +74,5 @@ data docs/*.html *.inv *.js +!docs/_static/js docs/_images/ From c9dcfac8522ce49edc05d3e55a9d1f66e9c96006 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 21:40:53 +0300 Subject: [PATCH 14/42] Document certain special members --- docs/_templates/class.rst | 6 ++---- docs/conf.py | 7 ++++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/_templates/class.rst b/docs/_templates/class.rst index 54853226b2..b8e7492d5b 100644 --- a/docs/_templates/class.rst +++ b/docs/_templates/class.rst @@ -5,10 +5,8 @@ .. autoclass:: {{ objname }} :members: - - {% block methods %} - .. automethod:: __init__ - {% endblock %} + :special-members: + :exclude-members: __init__ .. raw:: html diff --git a/docs/conf.py b/docs/conf.py index f01f6a62d5..38abc118aa 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,8 +40,14 @@ # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] +# Generate stub files for autosummary entries autosummary_generate = True +# Only class' own docs in autoclass directive +autoclass_content = 'both' + +autodoc_member_order = 'bysource' + # The suffix of source filenames. source_suffix = '.rst' @@ -53,7 +59,6 @@ 'backreferences_dir': os.path.join('modules', 'generated'), 'reference_url': {'gensim': None}, 'plot_gallery': True - } # The master toctree document. From 15c2ef7c0448a974d0e9772294256009fb3d9455 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 22:54:38 +0300 Subject: [PATCH 15/42] Add downloader's userguide --- .gitignore | 2 ++ docs/apiref_nextgen.rst | 2 ++ docs/indextoc.rst | 1 + docs/modules/downloader.rst | 32 ++++++++++++++++++++++++++++++++ docs/user_guide.rst | 11 +++++++++++ gensim/downloader.py | 33 +-------------------------------- 6 files changed, 49 insertions(+), 32 deletions(-) create mode 100644 docs/modules/downloader.rst create mode 100644 docs/user_guide.rst diff --git a/.gitignore b/.gitignore index f15a3826e3..4588a0cf4d 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ Thumbs.db cython_debug docs/_build/ docs/generated/ +docs/modules/generated/ docs/auto_examples/ docs/notebooks/.ipynb_checkpoints dedan_gensim.tmproj @@ -72,6 +73,7 @@ data *~ *_out.txt docs/*.html +docs/modules/*.html *.inv *.js !docs/_static/js diff --git a/docs/apiref_nextgen.rst b/docs/apiref_nextgen.rst index e32a76407a..fb7a997e00 100644 --- a/docs/apiref_nextgen.rst +++ b/docs/apiref_nextgen.rst @@ -98,6 +98,8 @@ Wrappers :no-members: :no-inherited-members: +**User guide:** See the :ref:`downloader` section for further details. + Functions --------- .. currentmodule:: gensim.downloader diff --git a/docs/indextoc.rst b/docs/indextoc.rst index b86c63966c..7bf9085b8e 100644 --- a/docs/indextoc.rst +++ b/docs/indextoc.rst @@ -10,3 +10,4 @@ wiki apiref apiref_nextgen + user_guide diff --git a/docs/modules/downloader.rst b/docs/modules/downloader.rst new file mode 100644 index 0000000000..605790a0b2 --- /dev/null +++ b/docs/modules/downloader.rst @@ -0,0 +1,32 @@ +.. _downloader: + +========== +Downloader +========== + +Give information about available models/datasets:: + + >>> import gensim.downloader as api + >>> + >>> api.info() # return dict with info about available models/datasets + >>> api.info("text8") # return dict with info about "text8" dataset + +Model example:: + + >>> import gensim.downloader as api + >>> + >>> model = api.load("glove-twitter-25") # load glove vectors + >>> model.most_similar("cat") # show words that similar to word 'cat' + +Dataset example:: + + >>> import gensim.downloader as api + >>> from gensim.models import Word2Vec + >>> + >>> dataset = api.load("text8") # load dataset as iterable + >>> model = Word2Vec(dataset) # train w2v model + +Also, this API available via CLI:: + + python -m gensim.downloader --info # same as api.info(dataname) + python -m gensim.downloader --download # same as api.load(dataname, return_path=True) diff --git a/docs/user_guide.rst b/docs/user_guide.rst new file mode 100644 index 0000000000..b517cd7bd8 --- /dev/null +++ b/docs/user_guide.rst @@ -0,0 +1,11 @@ +.. title:: User guide: contents + +.. _user_guide: + +========== +User Guide +========== + +.. toctree:: + + modules/downloader diff --git a/gensim/downloader.py b/gensim/downloader.py index 8a787207f2..e6b85c5cf3 100644 --- a/gensim/downloader.py +++ b/gensim/downloader.py @@ -1,36 +1,5 @@ """ -This module is an API for downloading, getting information and loading datasets/models. - -Give information about available models/datasets: - ->>> import gensim.downloader as api ->>> ->>> api.info() # return dict with info about available models/datasets ->>> api.info("text8") # return dict with info about "text8" dataset - - -Model example: - ->>> import gensim.downloader as api ->>> ->>> model = api.load("glove-twitter-25") # load glove vectors ->>> model.most_similar("cat") # show words that similar to word 'cat' - - -Dataset example: - ->>> import gensim.downloader as api ->>> from gensim.models import Word2Vec ->>> ->>> dataset = api.load("text8") # load dataset as iterable ->>> model = Word2Vec(dataset) # train w2v model - - -Also, this API available via CLI:: - - python -m gensim.downloader --info # same as api.info(dataname) - python -m gensim.downloader --download # same as api.load(dataname, return_path=True) - +API for downloading, getting information and loading datasets/models. """ from __future__ import absolute_import import argparse From 034137b942a753b752026a139fc44c96d81ab0a7 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Mon, 19 Feb 2018 23:06:05 +0300 Subject: [PATCH 16/42] Fix circleci config --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d2125123c3..d40b687ef9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -33,7 +33,7 @@ jobs: tox -e docs -vv - store_artifacts: - path: docs/src/_build + path: docs/_build destination: documentation - save_cache: From 2b072837d63f948bce514c788eb086f40d360706 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 20 Feb 2018 15:45:20 +0300 Subject: [PATCH 17/42] Fix gensim_theme static --- .gitignore | 3 +- docs/gensim_theme/static/doctools.js | 247 +++++++++++++++++++++++ docs/gensim_theme/static/jquery.js | 4 + docs/gensim_theme/static/underscore.js | 23 +++ examples/plot_downloader_api_tutorial.py | 48 +++++ setup.py | 3 +- 6 files changed, 326 insertions(+), 2 deletions(-) create mode 100644 docs/gensim_theme/static/doctools.js create mode 100644 docs/gensim_theme/static/jquery.js create mode 100644 docs/gensim_theme/static/underscore.js create mode 100644 examples/plot_downloader_api_tutorial.py diff --git a/.gitignore b/.gitignore index 4588a0cf4d..2f84631d53 100644 --- a/.gitignore +++ b/.gitignore @@ -76,5 +76,6 @@ docs/*.html docs/modules/*.html *.inv *.js -!docs/_static/js +!docs/_static/js/*.js +!docs/gensim_theme/static/*.js docs/_images/ diff --git a/docs/gensim_theme/static/doctools.js b/docs/gensim_theme/static/doctools.js new file mode 100644 index 0000000000..d4619fdfb1 --- /dev/null +++ b/docs/gensim_theme/static/doctools.js @@ -0,0 +1,247 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +} + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s == 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * small function to check if an array contains + * a given item. + */ +jQuery.contains = function(arr, item) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == item) + return true; + } + return false; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/gensim_theme/static/jquery.js b/docs/gensim_theme/static/jquery.js new file mode 100644 index 0000000000..198b3ff07d --- /dev/null +++ b/docs/gensim_theme/static/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/docs/gensim_theme/static/underscore.js b/docs/gensim_theme/static/underscore.js new file mode 100644 index 0000000000..5d89914340 --- /dev/null +++ b/docs/gensim_theme/static/underscore.js @@ -0,0 +1,23 @@ +// Underscore.js 0.5.5 +// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc. +// Underscore is freely distributable under the terms of the MIT license. +// Portions of Underscore are inspired by or borrowed from Prototype.js, +// Oliver Steele's Functional, and John Resig's Micro-Templating. +// For all details and documentation: +// http://documentcloud.github.com/underscore/ +(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;gf?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)}); +return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length); +var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false; +if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length== +0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&& +a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g, +" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments); +o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})(); diff --git a/examples/plot_downloader_api_tutorial.py b/examples/plot_downloader_api_tutorial.py new file mode 100644 index 0000000000..3df47630d0 --- /dev/null +++ b/examples/plot_downloader_api_tutorial.py @@ -0,0 +1,48 @@ +# coding: utf-8 + +""" +Tutorial for using Gensim's API for downloading corpuses/models + +Let's start by importing the api module. +""" + +import logging +import gensim.downloader as api + +logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) + +# Now, lets download the text8 corpus and load it to memory (automatically) + +corpus = api.load('text8') + +# As the corpus has been downloaded and loaded, let's create a word2vec model of our corpus. + +from gensim.models.word2vec import Word2Vec + +model = Word2Vec(corpus) + +# Now that we have our word2vec model, let's find words that are similar to 'tree' + +model.most_similar('tree') + +# You can use the API to download many corpora and models. You can get the list of all the models and corpora that are provided, by using the code below: + +import json +data_list = api.info() +print(json.dumps(data_list, indent=4)) + +# If you want to get detailed information about the model/corpus, use: + +fake_news_info = api.info('fake-news') +print(json.dumps(fake_news_info, indent=4)) + +# Sometimes, you do not want to load the model to memory. You would just want to get the path to the model. For that, use : + +print(api.load('glove-wiki-gigaword-50', return_path=True)) + +# If you want to load the model to memory, then: + +model = api.load("glove-wiki-gigaword-50") +model.most_similar("glass") + +# In corpora, the corpus is never loaded to memory, all corpuses wrapped to special class `Dataset` and provide `__iter__` method diff --git a/setup.py b/setup.py index df454e9ceb..13eba59ffa 100644 --- a/setup.py +++ b/setup.py @@ -314,7 +314,8 @@ def finalize_options(self): 'plotly', 'pattern', 'sphinx_gallery', 'matplotlib', - 'sphinxcontrib.programoutput'], + 'sphinxcontrib.programoutput', + 'pillow'], }, include_package_data=True, From 3e7519d8d23590621d2c214e13dea81cd5f27638 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 23 Feb 2018 09:53:10 +0300 Subject: [PATCH 18/42] Fix some issues --- docs/Makefile | 1 - docs/_static/js/jquery-migrate-1.1.1.min.js | 4 +--- docs/conf.py | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/Makefile b/docs/Makefile index 3c758f1b61..a002b4795c 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -6,7 +6,6 @@ # You can set these variables from the command line. SPHINXOPTS = -W -# SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build diff --git a/docs/_static/js/jquery-migrate-1.1.1.min.js b/docs/_static/js/jquery-migrate-1.1.1.min.js index eb3ecb1b3d..455be558e1 100644 --- a/docs/_static/js/jquery-migrate-1.1.1.min.js +++ b/docs/_static/js/jquery-migrate-1.1.1.min.js @@ -1,3 +1 @@ -/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ -jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); -//@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file +/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); //@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 38abc118aa..481a8b4add 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,6 @@ 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.napoleon', - 'sphinx_gallery.gen_gallery', 'sphinx.ext.imgmath', 'sphinxcontrib.programoutput', ] @@ -58,7 +57,7 @@ 'doc_module': 'gensim', 'backreferences_dir': os.path.join('modules', 'generated'), 'reference_url': {'gensim': None}, - 'plot_gallery': True + 'plot_gallery': False, } # The master toctree document. From 7b1541988e406e33352acf60470dc3630f6cf192 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 23 Feb 2018 10:30:57 +0300 Subject: [PATCH 19/42] Fix some more issues --- docs/src/corpora/_mmreader.rst | 9 --------- gensim/models/__init__.py | 4 +--- gensim/models/fasttext.py | 2 +- gensim/models/translation_matrix.py | 3 +-- setup.py | 16 +++++++++------- 5 files changed, 12 insertions(+), 22 deletions(-) delete mode 100644 docs/src/corpora/_mmreader.rst diff --git a/docs/src/corpora/_mmreader.rst b/docs/src/corpora/_mmreader.rst deleted file mode 100644 index b2802453b2..0000000000 --- a/docs/src/corpora/_mmreader.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`corpora._mmreader` -- Reader for corpus in the Matrix Market format. -========================================================================== - -.. automodule:: gensim.corpora._mmreader - :synopsis: Reader for corpus in the Matrix Market format. - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/gensim/models/__init__.py b/gensim/models/__init__.py index 5b3dda452d..e0bcedf29f 100644 --- a/gensim/models/__init__.py +++ b/gensim/models/__init__.py @@ -1,6 +1,4 @@ -""" -Extraction of documents representations from their raw bag-of-word counts. -""" +"""Extraction of documents representations from their raw bag-of-word counts.""" # bring model classes directly into package namespace, to save some typing from .coherencemodel import CoherenceModel # noqa:F401 diff --git a/gensim/models/fasttext.py b/gensim/models/fasttext.py index 78ff610e6b..2ff2bd243c 100644 --- a/gensim/models/fasttext.py +++ b/gensim/models/fasttext.py @@ -161,7 +161,7 @@ def train_batch_sg(model, sentences, alpha, work=None, neu1=None): class FastText(BaseWordEmbeddingsModel): """Class for training, using and evaluating word representations learned using method - described in [1] aka Fasttext. + described `aka Fasttext `_. The model can be stored/loaded via its :meth:`~gensim.models.fasttext.FastText.save()` and :meth:`~gensim.models.fasttext.FastText.load()` methods, or loaded in a format compatible with the original diff --git a/gensim/models/translation_matrix.py b/gensim/models/translation_matrix.py index 1498256ed5..5be93a8358 100644 --- a/gensim/models/translation_matrix.py +++ b/gensim/models/translation_matrix.py @@ -266,8 +266,7 @@ def translate(self, source_words, topn=5, gc=0, sample_num=None, source_lang_vec topn : int, optional Number of words than will be returned as translation for each `source_words` gc : int, optional - Define the translation algorithm, if `gc == 0` - use standard NN - retrieval, + Define the translation algorithm, if `gc == 0` - use standard NN retrieval, otherwise, use globally corrected neighbour retrieval method (as described in [1]). sample_num : int, optional Number of word to sample from the source lexicon, if `gc == 1`, then `sample_num` **must** be provided. diff --git a/setup.py b/setup.py index e538d46fa7..0486b6c08d 100644 --- a/setup.py +++ b/setup.py @@ -311,13 +311,15 @@ def finalize_options(self): 'distributed': distributed_env, 'test-win': win_testenv, 'test': linux_testenv, - 'docs': linux_testenv + distributed_env + ['sphinx', - 'sphinxcontrib-napoleon', - 'plotly', 'pattern', - 'sphinx_gallery', - 'matplotlib', - 'sphinxcontrib.programoutput', - 'pillow'], + 'docs': linux_testenv + distributed_env + [ + 'sphinx', + 'sphinxcontrib-napoleon', + 'plotly', 'pattern', + 'sphinx_gallery', + 'matplotlib', + 'sphinxcontrib.programoutput', + 'pillow' + ], }, include_package_data=True, From 97c8ba3bc347bd97c700b5e0e56ab030c53783fc Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 23 Feb 2018 11:18:55 +0300 Subject: [PATCH 20/42] Make link to legacy version of apiref --- docs/apiref.rst | 480 +++++++++++++++++++++++++++++++++++++++- docs/apiref_legacy.rst | 14 ++ docs/apiref_nextgen.rst | 479 --------------------------------------- docs/indextoc.rst | 2 +- 4 files changed, 489 insertions(+), 486 deletions(-) create mode 100644 docs/apiref_legacy.rst delete mode 100644 docs/apiref_nextgen.rst diff --git a/docs/apiref.rst b/docs/apiref.rst index d31a824258..78921f4aad 100644 --- a/docs/apiref.rst +++ b/docs/apiref.rst @@ -2,13 +2,481 @@ API Reference ============= -.. _api_ref: +.. note:: + This is the new style of API reference. :ref:`The old version `. -.. currentmodule:: gensim +.. _models_ref: -.. toctree:: - :maxdepth: 0 - :glob: +:mod:`gensim.models`: Models +============================ - generated/* +.. automodule:: gensim.models + :no-members: + :no-inherited-members: +Document -> Vector +------------------ +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ldamodel.LdaModel + ldamulticore.LdaMulticore + ldaseqmodel.LdaSeqModel + tfidfmodel.TfidfModel + rpmodel.RpModel + hdpmodel.HdpModel + atmodel.AuthorTopicModel + doc2vec.Doc2Vec + +Word -> Vector +-------------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + word2vec.Word2Vec + fasttext.FastText + +Utils +----- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + keyedvectors.KeyedVectors + phrases.SentenceAnalyzer + coherencemodel.CoherenceModel + basemodel.BaseTopicModel + +Workers +------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + lsi_worker.Worker + lda_worker.Worker + +Dispatchers +----------- +.. currentmodule:: gensim.models + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + lsi_dispatcher.Dispatcher + lda_dispatcher.Dispatcher + +Wrappers +-------- +.. currentmodule:: gensim.models.wrappers + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ldamallet.LdaMallet + dtmmodel.DtmModel + ldavowpalwabbit.LdaVowpalWabbit + wordrank.Wordrank + varembed.VarEmbed + fasttext.FastText + +.. _downloader_ref: + +:mod:`gensim.downloader`: Downloader +==================================== + +.. automodule:: gensim.downloader + :no-members: + :no-inherited-members: + +**User guide:** See the :ref:`downloader` section for further details. + +Functions +--------- +.. currentmodule:: gensim.downloader + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + info + load + +.. _scripts_ref: + +:mod:`gensim.scripts`: Scripts +============================== + +.. automodule:: gensim.scripts + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.scripts + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + glove2word2vec.get_glove_info + glove2word2vec.glove2word2vec + word2vec2tensor.word2vec2tensor + segment_wiki.segment_all_articles + segment_wiki.segment_and_write_all_articles + segment_wiki.extract_page_xmls + segment_wiki.segment + +.. _corpora_ref: + +:mod:`gensim.corpora`: Corpora +============================== + +.. automodule:: gensim.corpora + :no-members: + :no-inherited-members: + +Corpora +------- +.. currentmodule:: gensim.corpora + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + bleicorpus.BleiCorpus + csvcorpus.CsvCorpus + indexedcorpus.IndexedCorpus + lowcorpus.LowCorpus + malletcorpus.MalletCorpus + mmcorpus.MmCorpus + sharded_corpus.ShardedCorpus + svmlightcorpus.SvmLightCorpus + textcorpus.TextCorpus + ucicorpus.UciCorpus + wikicorpus.WikiCorpus + +Dictionaries +------------ +.. currentmodule:: gensim.corpora + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + dictionary.Dictionary + hashdictionary.HashDictionary + +.. _similarities_ref: + +:mod:`gensim.similarities`: Similarities +======================================== + +.. automodule:: gensim.similarities + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.similarities + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + docsim.Shard + docsim.Similarity + docsim.MatrixSimilarity + docsim.SparseMatrixSimilarity + index.AnnoyIndexer + +.. _parsing_ref: + +:mod:`gensim.parsing`: Parsing +============================== + +.. automodule:: gensim.parsing + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + porter.PorterStemmer + +Functions +--------- +.. currentmodule:: gensim.parsing + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + preprocessing.remove_stopwords + preprocessing.strip_punctuation + preprocessing.strip_tags + preprocessing.strip_short + preprocessing.strip_numeric + preprocessing.strip_non_alphanum + preprocessing.strip_multiple_whitespaces + preprocessing.split_alphanum + preprocessing.stem_text + preprocessing.preprocess_string + preprocessing.preprocess_documents + preprocessing.read_file + preprocessing.read_files + +.. _summarization_ref: + +:mod:`gensim.summarization`: Summarization +========================================== + +.. automodule:: gensim.summarization + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.summarization + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + bm25.BM25 + +Functions +--------- +.. currentmodule:: gensim.summarization + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + summarizer.summarize + summarizer.summarize_corpus + mz_entropy.mz_keywords + bm25.get_bm25_weights + keywords.keywords + +.. _sklearn_api_ref: + +:mod:`gensim.sklearn_api`: Sklearn API +====================================== + +.. automodule:: gensim.sklearn_api + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.sklearn_api + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + atmodel.AuthorTopicTransformer + d2vmodel.D2VTransformer + hdp.HdpTransformer + ldamodel.LdaTransformer + ldaseqmodel.LdaSeqTransformer + lsimodel.LsiTransformer + phrases.PhrasesTransformer + rpmodel.RpTransformer + text2bow.Text2BowTransformer + tfidf.TfIdfTransformer + w2vmodel.W2VTransformer + +.. _viz_ref: + +:mod:`gensim.viz`: Visualization +================================ + +.. automodule:: gensim.viz + :no-members: + :no-inherited-members: + +Functions +--------- +.. currentmodule:: gensim.viz + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + poincare.poincare_2d_visualization + poincare.poincare_distance_heatmap + +.. _interfaces_ref: + +:mod:`gensim.interfaces`: Interfaces +==================================== + +.. automodule:: gensim.interfaces + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.interfaces + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + CorpusABC + TransformedCorpus + TransformationABC + SimilarityABC + +.. _utils_ref: + +:mod:`gensim.utils`: Utils +========================== + +.. automodule:: gensim.utils + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.utils + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + SaveLoad + FakeDict + RepeatCorpusNTimes + ClippedCorpus + SlicedCorpus + InputQueue + +Functions +--------- +.. currentmodule:: gensim.utils + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + get_random_state + synchronous + file_or_filename + deaccent + copytree_hardlink + tokenize + simple_tokenize + simple_preprocess + any2utf8 + any2unicode + call_on_class_only + identity + get_max_id + dict_from_corpus + is_corpus + get_my_ip + safe_unichr + decode_htmlentities + chunkize_serial + chunkize + smart_extension + pickle + unpickle + revdict + deprecated + randfname + upload_chunked + getNS + pyro_daemon + has_pattern + lemmatize + mock_data_row + mock_data + prune_vocab + qsize + keep_vocab_item + check_output + sample_dict + strided_windows + iter_windows + flatten + lazy_flatten + +.. _matutils_ref: + +:mod:`gensim.matutils`: Matutils +================================ + +.. automodule:: gensim.matutils + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim.matutils + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + Scipy2Corpus + Dense2Corpus + Sparse2Corpus + MmWriter + MmReader + +Functions +--------- +.. currentmodule:: gensim.matutils + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + blas + argsort + corpus2csc + pad + zeros_aligned + ismatrix + any2sparse + scipy2scipy_clipped + scipy2sparse + sparse2full + full2sparse + full2sparse_clipped + corpus2dense + veclen + ret_normalized_vec + ret_log_normalize_vec + unitvec + cossim + isbow + convert_vec + kullback_leibler + jensen_shannon + hellinger + jaccard + jaccard_distance + dirichlet_expectation + qr_destroy diff --git a/docs/apiref_legacy.rst b/docs/apiref_legacy.rst new file mode 100644 index 0000000000..d3639cd2e1 --- /dev/null +++ b/docs/apiref_legacy.rst @@ -0,0 +1,14 @@ +============= +API Reference +============= + +.. _apiref_legacy: + +.. currentmodule:: gensim + +.. toctree:: + :maxdepth: 0 + :glob: + + generated/* + diff --git a/docs/apiref_nextgen.rst b/docs/apiref_nextgen.rst deleted file mode 100644 index fb7a997e00..0000000000 --- a/docs/apiref_nextgen.rst +++ /dev/null @@ -1,479 +0,0 @@ -============= -API Reference -============= - -.. _models_ref: - -:mod:`gensim.models`: Models -============================ - -.. automodule:: gensim.models - :no-members: - :no-inherited-members: - -Document -> Vector ------------------- -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - ldamodel.LdaModel - ldamulticore.LdaMulticore - ldaseqmodel.LdaSeqModel - tfidfmodel.TfidfModel - rpmodel.RpModel - hdpmodel.HdpModel - atmodel.AuthorTopicModel - doc2vec.Doc2Vec - -Word -> Vector --------------- -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - word2vec.Word2Vec - fasttext.FastText - -Utils ------ -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - keyedvectors.KeyedVectors - phrases.SentenceAnalyzer - coherencemodel.CoherenceModel - basemodel.BaseTopicModel - -Workers -------- -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - lsi_worker.Worker - lda_worker.Worker - -Dispatchers ------------ -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - lsi_dispatcher.Dispatcher - lda_dispatcher.Dispatcher - -Wrappers --------- -.. currentmodule:: gensim.models.wrappers - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - ldamallet.LdaMallet - dtmmodel.DtmModel - ldavowpalwabbit.LdaVowpalWabbit - wordrank.Wordrank - varembed.VarEmbed - fasttext.FastText - -.. _downloader_ref: - -:mod:`gensim.downloader`: Downloader -==================================== - -.. automodule:: gensim.downloader - :no-members: - :no-inherited-members: - -**User guide:** See the :ref:`downloader` section for further details. - -Functions ---------- -.. currentmodule:: gensim.downloader - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - info - load - -.. _scripts_ref: - -:mod:`gensim.scripts`: Scripts -============================== - -.. automodule:: gensim.scripts - :no-members: - :no-inherited-members: - -Functions ---------- -.. currentmodule:: gensim.scripts - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - glove2word2vec.get_glove_info - glove2word2vec.glove2word2vec - word2vec2tensor.word2vec2tensor - segment_wiki.segment_all_articles - segment_wiki.segment_and_write_all_articles - segment_wiki.extract_page_xmls - segment_wiki.segment - -.. _corpora_ref: - -:mod:`gensim.corpora`: Corpora -============================== - -.. automodule:: gensim.corpora - :no-members: - :no-inherited-members: - -Corpora -------- -.. currentmodule:: gensim.corpora - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - bleicorpus.BleiCorpus - csvcorpus.CsvCorpus - indexedcorpus.IndexedCorpus - lowcorpus.LowCorpus - malletcorpus.MalletCorpus - mmcorpus.MmCorpus - sharded_corpus.ShardedCorpus - svmlightcorpus.SvmLightCorpus - textcorpus.TextCorpus - ucicorpus.UciCorpus - wikicorpus.WikiCorpus - -Dictionaries ------------- -.. currentmodule:: gensim.corpora - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - dictionary.Dictionary - hashdictionary.HashDictionary - -.. _similarities_ref: - -:mod:`gensim.similarities`: Similarities -======================================== - -.. automodule:: gensim.similarities - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.similarities - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - docsim.Shard - docsim.Similarity - docsim.MatrixSimilarity - docsim.SparseMatrixSimilarity - index.AnnoyIndexer - -.. _parsing_ref: - -:mod:`gensim.parsing`: Parsing -============================== - -.. automodule:: gensim.parsing - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.parsing - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - porter.PorterStemmer - -Functions ---------- -.. currentmodule:: gensim.parsing - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - preprocessing.remove_stopwords - preprocessing.strip_punctuation - preprocessing.strip_tags - preprocessing.strip_short - preprocessing.strip_numeric - preprocessing.strip_non_alphanum - preprocessing.strip_multiple_whitespaces - preprocessing.split_alphanum - preprocessing.stem_text - preprocessing.preprocess_string - preprocessing.preprocess_documents - preprocessing.read_file - preprocessing.read_files - -.. _summarization_ref: - -:mod:`gensim.summarization`: Summarization -========================================== - -.. automodule:: gensim.summarization - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.summarization - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - bm25.BM25 - -Functions ---------- -.. currentmodule:: gensim.summarization - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - summarizer.summarize - summarizer.summarize_corpus - mz_entropy.mz_keywords - bm25.get_bm25_weights - keywords.keywords - -.. _sklearn_api_ref: - -:mod:`gensim.sklearn_api`: Sklearn API -====================================== - -.. automodule:: gensim.sklearn_api - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.sklearn_api - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - atmodel.AuthorTopicTransformer - d2vmodel.D2VTransformer - hdp.HdpTransformer - ldamodel.LdaTransformer - ldaseqmodel.LdaSeqTransformer - lsimodel.LsiTransformer - phrases.PhrasesTransformer - rpmodel.RpTransformer - text2bow.Text2BowTransformer - tfidf.TfIdfTransformer - w2vmodel.W2VTransformer - -.. _viz_ref: - -:mod:`gensim.viz`: Visualization -================================ - -.. automodule:: gensim.viz - :no-members: - :no-inherited-members: - -Functions ---------- -.. currentmodule:: gensim.viz - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - poincare.poincare_2d_visualization - poincare.poincare_distance_heatmap - -.. _interfaces_ref: - -:mod:`gensim.interfaces`: Interfaces -==================================== - -.. automodule:: gensim.interfaces - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.interfaces - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - CorpusABC - TransformedCorpus - TransformationABC - SimilarityABC - -.. _utils_ref: - -:mod:`gensim.utils`: Utils -========================== - -.. automodule:: gensim.utils - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.utils - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - SaveLoad - FakeDict - RepeatCorpusNTimes - ClippedCorpus - SlicedCorpus - InputQueue - -Functions ---------- -.. currentmodule:: gensim.utils - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - get_random_state - synchronous - file_or_filename - deaccent - copytree_hardlink - tokenize - simple_tokenize - simple_preprocess - any2utf8 - any2unicode - call_on_class_only - identity - get_max_id - dict_from_corpus - is_corpus - get_my_ip - safe_unichr - decode_htmlentities - chunkize_serial - chunkize - smart_extension - pickle - unpickle - revdict - deprecated - randfname - upload_chunked - getNS - pyro_daemon - has_pattern - lemmatize - mock_data_row - mock_data - prune_vocab - qsize - keep_vocab_item - check_output - sample_dict - strided_windows - iter_windows - flatten - lazy_flatten - -.. _matutils_ref: - -:mod:`gensim.matutils`: Matutils -================================ - -.. automodule:: gensim.matutils - :no-members: - :no-inherited-members: - -Classes -------- -.. currentmodule:: gensim.matutils - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - Scipy2Corpus - Dense2Corpus - Sparse2Corpus - MmWriter - MmReader - -Functions ---------- -.. currentmodule:: gensim.matutils - -.. autosummary:: - :toctree: generated/ - :template: function.rst - - blas - argsort - corpus2csc - pad - zeros_aligned - ismatrix - any2sparse - scipy2scipy_clipped - scipy2sparse - sparse2full - full2sparse - full2sparse_clipped - corpus2dense - veclen - ret_normalized_vec - ret_log_normalize_vec - unitvec - cossim - isbow - convert_vec - kullback_leibler - jensen_shannon - hellinger - jaccard - jaccard_distance - dirichlet_expectation - qr_destroy diff --git a/docs/indextoc.rst b/docs/indextoc.rst index 7bf9085b8e..648e42c0a6 100644 --- a/docs/indextoc.rst +++ b/docs/indextoc.rst @@ -9,5 +9,5 @@ support wiki apiref - apiref_nextgen + apiref_legacy user_guide From 6a29c918494e8d39311ddf93f5b8231a0dcb68d9 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 23 Feb 2018 11:38:41 +0300 Subject: [PATCH 21/42] Fix cyclic import --- gensim/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/__init__.py b/gensim/__init__.py index bbb1fb5aca..812266512c 100644 --- a/gensim/__init__.py +++ b/gensim/__init__.py @@ -1,7 +1,7 @@ """Computation of pair-wise document similarities over a corpus of documents. """ -from gensim import parsing, matutils, interfaces, corpora, models, similarities, summarization, utils # noqa:F401 +from gensim import parsing, corpora, matutils, interfaces, models, similarities, summarization, utils # noqa:F401 import logging __version__ = '3.3.0' From 58a46aeb8f09c4b6f91109103371646246fa2df8 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 23 Feb 2018 12:03:48 +0300 Subject: [PATCH 22/42] They're back! --- .gitignore | 18 +++++----- docs/modules/downloader.rst | 32 ------------------ docs/{ => src}/Makefile | 2 +- docs/{ => src}/_static/css/anythingslider.css | 0 .../{ => src}/_static/css/jquery.qtip.min.css | 0 docs/{ => src}/_static/css/style.css | 0 docs/{ => src}/_static/favicon.ico | Bin docs/{ => src}/_static/images/arrows.png | Bin docs/{ => src}/_static/images/bg.png | Bin docs/{ => src}/_static/images/bullets.png | Bin docs/{ => src}/_static/images/checker.png | Bin docs/{ => src}/_static/images/default.png | Bin .../_static/images/direct-install.png | Bin docs/{ => src}/_static/images/download.png | Bin docs/{ => src}/_static/images/favicon.ico | Bin .../_static/images/features/converters.png | Bin .../features/efficient_implementations.png | Bin .../_static/images/features/free_lgpl.png | Bin .../images/features/memory_independence.png | Bin .../images/features/platform_independence.png | Bin .../_static/images/features/robust.png | Bin .../images/features/similarity_queries.png | Bin .../_static/images/features/support.png | Bin .../images/forkme_left_white_ffffff.png | Bin .../_static/images/gensim-footer.png | Bin docs/{ => src}/_static/images/gensim.png | Bin docs/{ => src}/_static/images/gensim_code.png | Bin .../_static/images/gensim_compact.png | Bin docs/{ => src}/_static/images/get-started.png | Bin .../{ => src}/_static/images/googlegroups.png | Bin docs/{ => src}/_static/images/loading.gif | Bin docs/{ => src}/_static/images/logo-gensim.png | Bin .../_static/images/logo-gensim_compact.png | Bin docs/{ => src}/_static/images/menubutton.png | Bin .../_static/images/references/logo_dtu.gif | Bin .../images/references/logo_dynadmic.png | Bin .../_static/images/references/logo_eudml.png | Bin .../_static/images/references/logo_ghent.png | Bin .../_static/images/references/logo_ibcn.png | Bin .../_static/images/references/logo_issuu.jpeg | Bin .../_static/images/references/logo_roistr.png | Bin .../references/logo_sportsauthority.png | Bin .../images/references/logo_tailwind.png | Bin docs/{ => src}/_static/images/tagline.png | Bin .../_static/images/tagline_compact.png | Bin docs/{ => src}/_static/images/twitterbird.png | Bin docs/{ => src}/_static/images/ukazka.png | Bin docs/{ => src}/_static/images/ukazka2.png | Bin docs/{ => src}/_static/js/jquery-1.9.1.min.js | 0 .../_static/js/jquery-migrate-1.1.1.min.js | 0 .../_static/js/jquery.anythingslider.min.js | 0 docs/{ => src}/_static/js/jquery.qtip.min.js | 0 docs/{ => src}/_templates/class.rst | 0 docs/{ => src}/_templates/function.rst | 0 docs/{ => src}/_templates/indexcontent.html | 0 docs/{ => src}/about.rst | 0 docs/{ => src}/apiref.rst | 0 docs/{ => src}/apiref_legacy.rst | 0 docs/{ => src}/changes_080.rst | 0 docs/{ => src}/conf.py | 0 docs/{ => src}/dist_lda.rst | 0 docs/{ => src}/dist_lsi.rst | 0 docs/{ => src}/distributed.rst | 0 docs/{ => src}/gensim_theme/domainindex.html | 0 docs/{ => src}/gensim_theme/genindex.html | 0 docs/{ => src}/gensim_theme/layout.html | 0 docs/{ => src}/gensim_theme/page.html | 0 docs/{ => src}/gensim_theme/search.html | 0 .../{ => src}/gensim_theme/static/doctools.js | 0 docs/{ => src}/gensim_theme/static/jquery.js | 0 .../gensim_theme/static/underscore.js | 0 docs/{ => src}/gensim_theme/theme.conf | 0 docs/{ => src}/indextoc.rst | 0 docs/{ => src}/install.rst | 0 docs/{ => src}/intro.rst | 0 docs/{ => src}/readme_images/12k.png | Bin docs/{ => src}/readme_images/amazon.png | Bin docs/{ => src}/readme_images/capitalone.png | Bin docs/{ => src}/readme_images/channel4.png | Bin docs/{ => src}/readme_images/cisco.png | Bin docs/{ => src}/readme_images/codeq.png | Bin docs/{ => src}/readme_images/issuu.png | Bin docs/{ => src}/readme_images/juju.png | Bin .../readme_images/mass-cognition.png | Bin docs/{ => src}/readme_images/mindseye.png | Bin docs/{ => src}/readme_images/nih.png | Bin docs/{ => src}/readme_images/nlpub.png | Bin docs/{ => src}/readme_images/rare.png | Bin .../readme_images/search-metrics.png | Bin docs/{ => src}/readme_images/siteground.png | Bin .../readme_images/sports-authority.png | Bin docs/{ => src}/readme_images/stillwater.png | Bin docs/{ => src}/readme_images/tailwind.png | Bin docs/{ => src}/readme_images/talent-pair.png | Bin docs/{ => src}/simserver.rst | 0 docs/{ => src}/support.rst | 0 docs/{ => src}/tut1.rst | 0 docs/{ => src}/tut2.rst | 0 docs/{ => src}/tut3.rst | 0 docs/{ => src}/tutorial.rst | 0 docs/{ => src}/user_guide.rst | 0 docs/{ => src}/wiki.rst | 0 tox.ini | 4 +-- 103 files changed, 12 insertions(+), 44 deletions(-) delete mode 100644 docs/modules/downloader.rst rename docs/{ => src}/Makefile (98%) rename docs/{ => src}/_static/css/anythingslider.css (100%) rename docs/{ => src}/_static/css/jquery.qtip.min.css (100%) rename docs/{ => src}/_static/css/style.css (100%) rename docs/{ => src}/_static/favicon.ico (100%) rename docs/{ => src}/_static/images/arrows.png (100%) rename docs/{ => src}/_static/images/bg.png (100%) rename docs/{ => src}/_static/images/bullets.png (100%) rename docs/{ => src}/_static/images/checker.png (100%) rename docs/{ => src}/_static/images/default.png (100%) rename docs/{ => src}/_static/images/direct-install.png (100%) rename docs/{ => src}/_static/images/download.png (100%) rename docs/{ => src}/_static/images/favicon.ico (100%) rename docs/{ => src}/_static/images/features/converters.png (100%) rename docs/{ => src}/_static/images/features/efficient_implementations.png (100%) rename docs/{ => src}/_static/images/features/free_lgpl.png (100%) rename docs/{ => src}/_static/images/features/memory_independence.png (100%) rename docs/{ => src}/_static/images/features/platform_independence.png (100%) rename docs/{ => src}/_static/images/features/robust.png (100%) rename docs/{ => src}/_static/images/features/similarity_queries.png (100%) rename docs/{ => src}/_static/images/features/support.png (100%) rename docs/{ => src}/_static/images/forkme_left_white_ffffff.png (100%) rename docs/{ => src}/_static/images/gensim-footer.png (100%) rename docs/{ => src}/_static/images/gensim.png (100%) rename docs/{ => src}/_static/images/gensim_code.png (100%) rename docs/{ => src}/_static/images/gensim_compact.png (100%) rename docs/{ => src}/_static/images/get-started.png (100%) rename docs/{ => src}/_static/images/googlegroups.png (100%) rename docs/{ => src}/_static/images/loading.gif (100%) rename docs/{ => src}/_static/images/logo-gensim.png (100%) rename docs/{ => src}/_static/images/logo-gensim_compact.png (100%) rename docs/{ => src}/_static/images/menubutton.png (100%) rename docs/{ => src}/_static/images/references/logo_dtu.gif (100%) rename docs/{ => src}/_static/images/references/logo_dynadmic.png (100%) rename docs/{ => src}/_static/images/references/logo_eudml.png (100%) rename docs/{ => src}/_static/images/references/logo_ghent.png (100%) rename docs/{ => src}/_static/images/references/logo_ibcn.png (100%) rename docs/{ => src}/_static/images/references/logo_issuu.jpeg (100%) rename docs/{ => src}/_static/images/references/logo_roistr.png (100%) rename docs/{ => src}/_static/images/references/logo_sportsauthority.png (100%) rename docs/{ => src}/_static/images/references/logo_tailwind.png (100%) rename docs/{ => src}/_static/images/tagline.png (100%) rename docs/{ => src}/_static/images/tagline_compact.png (100%) rename docs/{ => src}/_static/images/twitterbird.png (100%) rename docs/{ => src}/_static/images/ukazka.png (100%) rename docs/{ => src}/_static/images/ukazka2.png (100%) rename docs/{ => src}/_static/js/jquery-1.9.1.min.js (100%) rename docs/{ => src}/_static/js/jquery-migrate-1.1.1.min.js (100%) rename docs/{ => src}/_static/js/jquery.anythingslider.min.js (100%) rename docs/{ => src}/_static/js/jquery.qtip.min.js (100%) rename docs/{ => src}/_templates/class.rst (100%) rename docs/{ => src}/_templates/function.rst (100%) rename docs/{ => src}/_templates/indexcontent.html (100%) rename docs/{ => src}/about.rst (100%) rename docs/{ => src}/apiref.rst (100%) rename docs/{ => src}/apiref_legacy.rst (100%) rename docs/{ => src}/changes_080.rst (100%) rename docs/{ => src}/conf.py (100%) rename docs/{ => src}/dist_lda.rst (100%) rename docs/{ => src}/dist_lsi.rst (100%) rename docs/{ => src}/distributed.rst (100%) rename docs/{ => src}/gensim_theme/domainindex.html (100%) rename docs/{ => src}/gensim_theme/genindex.html (100%) rename docs/{ => src}/gensim_theme/layout.html (100%) rename docs/{ => src}/gensim_theme/page.html (100%) rename docs/{ => src}/gensim_theme/search.html (100%) rename docs/{ => src}/gensim_theme/static/doctools.js (100%) rename docs/{ => src}/gensim_theme/static/jquery.js (100%) rename docs/{ => src}/gensim_theme/static/underscore.js (100%) rename docs/{ => src}/gensim_theme/theme.conf (100%) rename docs/{ => src}/indextoc.rst (100%) rename docs/{ => src}/install.rst (100%) rename docs/{ => src}/intro.rst (100%) rename docs/{ => src}/readme_images/12k.png (100%) rename docs/{ => src}/readme_images/amazon.png (100%) rename docs/{ => src}/readme_images/capitalone.png (100%) rename docs/{ => src}/readme_images/channel4.png (100%) rename docs/{ => src}/readme_images/cisco.png (100%) rename docs/{ => src}/readme_images/codeq.png (100%) rename docs/{ => src}/readme_images/issuu.png (100%) rename docs/{ => src}/readme_images/juju.png (100%) rename docs/{ => src}/readme_images/mass-cognition.png (100%) rename docs/{ => src}/readme_images/mindseye.png (100%) rename docs/{ => src}/readme_images/nih.png (100%) rename docs/{ => src}/readme_images/nlpub.png (100%) rename docs/{ => src}/readme_images/rare.png (100%) rename docs/{ => src}/readme_images/search-metrics.png (100%) rename docs/{ => src}/readme_images/siteground.png (100%) rename docs/{ => src}/readme_images/sports-authority.png (100%) rename docs/{ => src}/readme_images/stillwater.png (100%) rename docs/{ => src}/readme_images/tailwind.png (100%) rename docs/{ => src}/readme_images/talent-pair.png (100%) rename docs/{ => src}/simserver.rst (100%) rename docs/{ => src}/support.rst (100%) rename docs/{ => src}/tut1.rst (100%) rename docs/{ => src}/tut2.rst (100%) rename docs/{ => src}/tut3.rst (100%) rename docs/{ => src}/tutorial.rst (100%) rename docs/{ => src}/user_guide.rst (100%) rename docs/{ => src}/wiki.rst (100%) diff --git a/.gitignore b/.gitignore index 2f84631d53..3136d30204 100644 --- a/.gitignore +++ b/.gitignore @@ -48,10 +48,10 @@ Thumbs.db .settings/ .eggs cython_debug -docs/_build/ -docs/generated/ -docs/modules/generated/ -docs/auto_examples/ +docs/src/_build/ +docs/src/generated/ +docs/src/modules/generated/ +docs/src/auto_examples/ docs/notebooks/.ipynb_checkpoints dedan_gensim.tmproj gensim*.egg-info @@ -72,10 +72,10 @@ data *.model *~ *_out.txt -docs/*.html -docs/modules/*.html +docs/src/*.html +docs/src/modules/*.html *.inv *.js -!docs/_static/js/*.js -!docs/gensim_theme/static/*.js -docs/_images/ +!docs/src/_static/js/*.js +!docs/src/gensim_theme/static/*.js +docs/src/_images/ diff --git a/docs/modules/downloader.rst b/docs/modules/downloader.rst deleted file mode 100644 index 605790a0b2..0000000000 --- a/docs/modules/downloader.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. _downloader: - -========== -Downloader -========== - -Give information about available models/datasets:: - - >>> import gensim.downloader as api - >>> - >>> api.info() # return dict with info about available models/datasets - >>> api.info("text8") # return dict with info about "text8" dataset - -Model example:: - - >>> import gensim.downloader as api - >>> - >>> model = api.load("glove-twitter-25") # load glove vectors - >>> model.most_similar("cat") # show words that similar to word 'cat' - -Dataset example:: - - >>> import gensim.downloader as api - >>> from gensim.models import Word2Vec - >>> - >>> dataset = api.load("text8") # load dataset as iterable - >>> model = Word2Vec(dataset) # train w2v model - -Also, this API available via CLI:: - - python -m gensim.downloader --info # same as api.info(dataname) - python -m gensim.downloader --download # same as api.load(dataname, return_path=True) diff --git a/docs/Makefile b/docs/src/Makefile similarity index 98% rename from docs/Makefile rename to docs/src/Makefile index a002b4795c..1cab7f3683 100644 --- a/docs/Makefile +++ b/docs/src/Makefile @@ -41,7 +41,7 @@ html: rm -r $(BUILDDIR)/html/_sources cp -r $(BUILDDIR)/html/* . @echo - @echo "Build finished. The HTML pages are in /docs" + @echo "Build finished. The HTML pages are in /docs/src" upload: scp -r _build/html/* rr:public_html/gensim/ diff --git a/docs/_static/css/anythingslider.css b/docs/src/_static/css/anythingslider.css similarity index 100% rename from docs/_static/css/anythingslider.css rename to docs/src/_static/css/anythingslider.css diff --git a/docs/_static/css/jquery.qtip.min.css b/docs/src/_static/css/jquery.qtip.min.css similarity index 100% rename from docs/_static/css/jquery.qtip.min.css rename to docs/src/_static/css/jquery.qtip.min.css diff --git a/docs/_static/css/style.css b/docs/src/_static/css/style.css similarity index 100% rename from docs/_static/css/style.css rename to docs/src/_static/css/style.css diff --git a/docs/_static/favicon.ico b/docs/src/_static/favicon.ico similarity index 100% rename from docs/_static/favicon.ico rename to docs/src/_static/favicon.ico diff --git a/docs/_static/images/arrows.png b/docs/src/_static/images/arrows.png similarity index 100% rename from docs/_static/images/arrows.png rename to docs/src/_static/images/arrows.png diff --git a/docs/_static/images/bg.png b/docs/src/_static/images/bg.png similarity index 100% rename from docs/_static/images/bg.png rename to docs/src/_static/images/bg.png diff --git a/docs/_static/images/bullets.png b/docs/src/_static/images/bullets.png similarity index 100% rename from docs/_static/images/bullets.png rename to docs/src/_static/images/bullets.png diff --git a/docs/_static/images/checker.png b/docs/src/_static/images/checker.png similarity index 100% rename from docs/_static/images/checker.png rename to docs/src/_static/images/checker.png diff --git a/docs/_static/images/default.png b/docs/src/_static/images/default.png similarity index 100% rename from docs/_static/images/default.png rename to docs/src/_static/images/default.png diff --git a/docs/_static/images/direct-install.png b/docs/src/_static/images/direct-install.png similarity index 100% rename from docs/_static/images/direct-install.png rename to docs/src/_static/images/direct-install.png diff --git a/docs/_static/images/download.png b/docs/src/_static/images/download.png similarity index 100% rename from docs/_static/images/download.png rename to docs/src/_static/images/download.png diff --git a/docs/_static/images/favicon.ico b/docs/src/_static/images/favicon.ico similarity index 100% rename from docs/_static/images/favicon.ico rename to docs/src/_static/images/favicon.ico diff --git a/docs/_static/images/features/converters.png b/docs/src/_static/images/features/converters.png similarity index 100% rename from docs/_static/images/features/converters.png rename to docs/src/_static/images/features/converters.png diff --git a/docs/_static/images/features/efficient_implementations.png b/docs/src/_static/images/features/efficient_implementations.png similarity index 100% rename from docs/_static/images/features/efficient_implementations.png rename to docs/src/_static/images/features/efficient_implementations.png diff --git a/docs/_static/images/features/free_lgpl.png b/docs/src/_static/images/features/free_lgpl.png similarity index 100% rename from docs/_static/images/features/free_lgpl.png rename to docs/src/_static/images/features/free_lgpl.png diff --git a/docs/_static/images/features/memory_independence.png b/docs/src/_static/images/features/memory_independence.png similarity index 100% rename from docs/_static/images/features/memory_independence.png rename to docs/src/_static/images/features/memory_independence.png diff --git a/docs/_static/images/features/platform_independence.png b/docs/src/_static/images/features/platform_independence.png similarity index 100% rename from docs/_static/images/features/platform_independence.png rename to docs/src/_static/images/features/platform_independence.png diff --git a/docs/_static/images/features/robust.png b/docs/src/_static/images/features/robust.png similarity index 100% rename from docs/_static/images/features/robust.png rename to docs/src/_static/images/features/robust.png diff --git a/docs/_static/images/features/similarity_queries.png b/docs/src/_static/images/features/similarity_queries.png similarity index 100% rename from docs/_static/images/features/similarity_queries.png rename to docs/src/_static/images/features/similarity_queries.png diff --git a/docs/_static/images/features/support.png b/docs/src/_static/images/features/support.png similarity index 100% rename from docs/_static/images/features/support.png rename to docs/src/_static/images/features/support.png diff --git a/docs/_static/images/forkme_left_white_ffffff.png b/docs/src/_static/images/forkme_left_white_ffffff.png similarity index 100% rename from docs/_static/images/forkme_left_white_ffffff.png rename to docs/src/_static/images/forkme_left_white_ffffff.png diff --git a/docs/_static/images/gensim-footer.png b/docs/src/_static/images/gensim-footer.png similarity index 100% rename from docs/_static/images/gensim-footer.png rename to docs/src/_static/images/gensim-footer.png diff --git a/docs/_static/images/gensim.png b/docs/src/_static/images/gensim.png similarity index 100% rename from docs/_static/images/gensim.png rename to docs/src/_static/images/gensim.png diff --git a/docs/_static/images/gensim_code.png b/docs/src/_static/images/gensim_code.png similarity index 100% rename from docs/_static/images/gensim_code.png rename to docs/src/_static/images/gensim_code.png diff --git a/docs/_static/images/gensim_compact.png b/docs/src/_static/images/gensim_compact.png similarity index 100% rename from docs/_static/images/gensim_compact.png rename to docs/src/_static/images/gensim_compact.png diff --git a/docs/_static/images/get-started.png b/docs/src/_static/images/get-started.png similarity index 100% rename from docs/_static/images/get-started.png rename to docs/src/_static/images/get-started.png diff --git a/docs/_static/images/googlegroups.png b/docs/src/_static/images/googlegroups.png similarity index 100% rename from docs/_static/images/googlegroups.png rename to docs/src/_static/images/googlegroups.png diff --git a/docs/_static/images/loading.gif b/docs/src/_static/images/loading.gif similarity index 100% rename from docs/_static/images/loading.gif rename to docs/src/_static/images/loading.gif diff --git a/docs/_static/images/logo-gensim.png b/docs/src/_static/images/logo-gensim.png similarity index 100% rename from docs/_static/images/logo-gensim.png rename to docs/src/_static/images/logo-gensim.png diff --git a/docs/_static/images/logo-gensim_compact.png b/docs/src/_static/images/logo-gensim_compact.png similarity index 100% rename from docs/_static/images/logo-gensim_compact.png rename to docs/src/_static/images/logo-gensim_compact.png diff --git a/docs/_static/images/menubutton.png b/docs/src/_static/images/menubutton.png similarity index 100% rename from docs/_static/images/menubutton.png rename to docs/src/_static/images/menubutton.png diff --git a/docs/_static/images/references/logo_dtu.gif b/docs/src/_static/images/references/logo_dtu.gif similarity index 100% rename from docs/_static/images/references/logo_dtu.gif rename to docs/src/_static/images/references/logo_dtu.gif diff --git a/docs/_static/images/references/logo_dynadmic.png b/docs/src/_static/images/references/logo_dynadmic.png similarity index 100% rename from docs/_static/images/references/logo_dynadmic.png rename to docs/src/_static/images/references/logo_dynadmic.png diff --git a/docs/_static/images/references/logo_eudml.png b/docs/src/_static/images/references/logo_eudml.png similarity index 100% rename from docs/_static/images/references/logo_eudml.png rename to docs/src/_static/images/references/logo_eudml.png diff --git a/docs/_static/images/references/logo_ghent.png b/docs/src/_static/images/references/logo_ghent.png similarity index 100% rename from docs/_static/images/references/logo_ghent.png rename to docs/src/_static/images/references/logo_ghent.png diff --git a/docs/_static/images/references/logo_ibcn.png b/docs/src/_static/images/references/logo_ibcn.png similarity index 100% rename from docs/_static/images/references/logo_ibcn.png rename to docs/src/_static/images/references/logo_ibcn.png diff --git a/docs/_static/images/references/logo_issuu.jpeg b/docs/src/_static/images/references/logo_issuu.jpeg similarity index 100% rename from docs/_static/images/references/logo_issuu.jpeg rename to docs/src/_static/images/references/logo_issuu.jpeg diff --git a/docs/_static/images/references/logo_roistr.png b/docs/src/_static/images/references/logo_roistr.png similarity index 100% rename from docs/_static/images/references/logo_roistr.png rename to docs/src/_static/images/references/logo_roistr.png diff --git a/docs/_static/images/references/logo_sportsauthority.png b/docs/src/_static/images/references/logo_sportsauthority.png similarity index 100% rename from docs/_static/images/references/logo_sportsauthority.png rename to docs/src/_static/images/references/logo_sportsauthority.png diff --git a/docs/_static/images/references/logo_tailwind.png b/docs/src/_static/images/references/logo_tailwind.png similarity index 100% rename from docs/_static/images/references/logo_tailwind.png rename to docs/src/_static/images/references/logo_tailwind.png diff --git a/docs/_static/images/tagline.png b/docs/src/_static/images/tagline.png similarity index 100% rename from docs/_static/images/tagline.png rename to docs/src/_static/images/tagline.png diff --git a/docs/_static/images/tagline_compact.png b/docs/src/_static/images/tagline_compact.png similarity index 100% rename from docs/_static/images/tagline_compact.png rename to docs/src/_static/images/tagline_compact.png diff --git a/docs/_static/images/twitterbird.png b/docs/src/_static/images/twitterbird.png similarity index 100% rename from docs/_static/images/twitterbird.png rename to docs/src/_static/images/twitterbird.png diff --git a/docs/_static/images/ukazka.png b/docs/src/_static/images/ukazka.png similarity index 100% rename from docs/_static/images/ukazka.png rename to docs/src/_static/images/ukazka.png diff --git a/docs/_static/images/ukazka2.png b/docs/src/_static/images/ukazka2.png similarity index 100% rename from docs/_static/images/ukazka2.png rename to docs/src/_static/images/ukazka2.png diff --git a/docs/_static/js/jquery-1.9.1.min.js b/docs/src/_static/js/jquery-1.9.1.min.js similarity index 100% rename from docs/_static/js/jquery-1.9.1.min.js rename to docs/src/_static/js/jquery-1.9.1.min.js diff --git a/docs/_static/js/jquery-migrate-1.1.1.min.js b/docs/src/_static/js/jquery-migrate-1.1.1.min.js similarity index 100% rename from docs/_static/js/jquery-migrate-1.1.1.min.js rename to docs/src/_static/js/jquery-migrate-1.1.1.min.js diff --git a/docs/_static/js/jquery.anythingslider.min.js b/docs/src/_static/js/jquery.anythingslider.min.js similarity index 100% rename from docs/_static/js/jquery.anythingslider.min.js rename to docs/src/_static/js/jquery.anythingslider.min.js diff --git a/docs/_static/js/jquery.qtip.min.js b/docs/src/_static/js/jquery.qtip.min.js similarity index 100% rename from docs/_static/js/jquery.qtip.min.js rename to docs/src/_static/js/jquery.qtip.min.js diff --git a/docs/_templates/class.rst b/docs/src/_templates/class.rst similarity index 100% rename from docs/_templates/class.rst rename to docs/src/_templates/class.rst diff --git a/docs/_templates/function.rst b/docs/src/_templates/function.rst similarity index 100% rename from docs/_templates/function.rst rename to docs/src/_templates/function.rst diff --git a/docs/_templates/indexcontent.html b/docs/src/_templates/indexcontent.html similarity index 100% rename from docs/_templates/indexcontent.html rename to docs/src/_templates/indexcontent.html diff --git a/docs/about.rst b/docs/src/about.rst similarity index 100% rename from docs/about.rst rename to docs/src/about.rst diff --git a/docs/apiref.rst b/docs/src/apiref.rst similarity index 100% rename from docs/apiref.rst rename to docs/src/apiref.rst diff --git a/docs/apiref_legacy.rst b/docs/src/apiref_legacy.rst similarity index 100% rename from docs/apiref_legacy.rst rename to docs/src/apiref_legacy.rst diff --git a/docs/changes_080.rst b/docs/src/changes_080.rst similarity index 100% rename from docs/changes_080.rst rename to docs/src/changes_080.rst diff --git a/docs/conf.py b/docs/src/conf.py similarity index 100% rename from docs/conf.py rename to docs/src/conf.py diff --git a/docs/dist_lda.rst b/docs/src/dist_lda.rst similarity index 100% rename from docs/dist_lda.rst rename to docs/src/dist_lda.rst diff --git a/docs/dist_lsi.rst b/docs/src/dist_lsi.rst similarity index 100% rename from docs/dist_lsi.rst rename to docs/src/dist_lsi.rst diff --git a/docs/distributed.rst b/docs/src/distributed.rst similarity index 100% rename from docs/distributed.rst rename to docs/src/distributed.rst diff --git a/docs/gensim_theme/domainindex.html b/docs/src/gensim_theme/domainindex.html similarity index 100% rename from docs/gensim_theme/domainindex.html rename to docs/src/gensim_theme/domainindex.html diff --git a/docs/gensim_theme/genindex.html b/docs/src/gensim_theme/genindex.html similarity index 100% rename from docs/gensim_theme/genindex.html rename to docs/src/gensim_theme/genindex.html diff --git a/docs/gensim_theme/layout.html b/docs/src/gensim_theme/layout.html similarity index 100% rename from docs/gensim_theme/layout.html rename to docs/src/gensim_theme/layout.html diff --git a/docs/gensim_theme/page.html b/docs/src/gensim_theme/page.html similarity index 100% rename from docs/gensim_theme/page.html rename to docs/src/gensim_theme/page.html diff --git a/docs/gensim_theme/search.html b/docs/src/gensim_theme/search.html similarity index 100% rename from docs/gensim_theme/search.html rename to docs/src/gensim_theme/search.html diff --git a/docs/gensim_theme/static/doctools.js b/docs/src/gensim_theme/static/doctools.js similarity index 100% rename from docs/gensim_theme/static/doctools.js rename to docs/src/gensim_theme/static/doctools.js diff --git a/docs/gensim_theme/static/jquery.js b/docs/src/gensim_theme/static/jquery.js similarity index 100% rename from docs/gensim_theme/static/jquery.js rename to docs/src/gensim_theme/static/jquery.js diff --git a/docs/gensim_theme/static/underscore.js b/docs/src/gensim_theme/static/underscore.js similarity index 100% rename from docs/gensim_theme/static/underscore.js rename to docs/src/gensim_theme/static/underscore.js diff --git a/docs/gensim_theme/theme.conf b/docs/src/gensim_theme/theme.conf similarity index 100% rename from docs/gensim_theme/theme.conf rename to docs/src/gensim_theme/theme.conf diff --git a/docs/indextoc.rst b/docs/src/indextoc.rst similarity index 100% rename from docs/indextoc.rst rename to docs/src/indextoc.rst diff --git a/docs/install.rst b/docs/src/install.rst similarity index 100% rename from docs/install.rst rename to docs/src/install.rst diff --git a/docs/intro.rst b/docs/src/intro.rst similarity index 100% rename from docs/intro.rst rename to docs/src/intro.rst diff --git a/docs/readme_images/12k.png b/docs/src/readme_images/12k.png similarity index 100% rename from docs/readme_images/12k.png rename to docs/src/readme_images/12k.png diff --git a/docs/readme_images/amazon.png b/docs/src/readme_images/amazon.png similarity index 100% rename from docs/readme_images/amazon.png rename to docs/src/readme_images/amazon.png diff --git a/docs/readme_images/capitalone.png b/docs/src/readme_images/capitalone.png similarity index 100% rename from docs/readme_images/capitalone.png rename to docs/src/readme_images/capitalone.png diff --git a/docs/readme_images/channel4.png b/docs/src/readme_images/channel4.png similarity index 100% rename from docs/readme_images/channel4.png rename to docs/src/readme_images/channel4.png diff --git a/docs/readme_images/cisco.png b/docs/src/readme_images/cisco.png similarity index 100% rename from docs/readme_images/cisco.png rename to docs/src/readme_images/cisco.png diff --git a/docs/readme_images/codeq.png b/docs/src/readme_images/codeq.png similarity index 100% rename from docs/readme_images/codeq.png rename to docs/src/readme_images/codeq.png diff --git a/docs/readme_images/issuu.png b/docs/src/readme_images/issuu.png similarity index 100% rename from docs/readme_images/issuu.png rename to docs/src/readme_images/issuu.png diff --git a/docs/readme_images/juju.png b/docs/src/readme_images/juju.png similarity index 100% rename from docs/readme_images/juju.png rename to docs/src/readme_images/juju.png diff --git a/docs/readme_images/mass-cognition.png b/docs/src/readme_images/mass-cognition.png similarity index 100% rename from docs/readme_images/mass-cognition.png rename to docs/src/readme_images/mass-cognition.png diff --git a/docs/readme_images/mindseye.png b/docs/src/readme_images/mindseye.png similarity index 100% rename from docs/readme_images/mindseye.png rename to docs/src/readme_images/mindseye.png diff --git a/docs/readme_images/nih.png b/docs/src/readme_images/nih.png similarity index 100% rename from docs/readme_images/nih.png rename to docs/src/readme_images/nih.png diff --git a/docs/readme_images/nlpub.png b/docs/src/readme_images/nlpub.png similarity index 100% rename from docs/readme_images/nlpub.png rename to docs/src/readme_images/nlpub.png diff --git a/docs/readme_images/rare.png b/docs/src/readme_images/rare.png similarity index 100% rename from docs/readme_images/rare.png rename to docs/src/readme_images/rare.png diff --git a/docs/readme_images/search-metrics.png b/docs/src/readme_images/search-metrics.png similarity index 100% rename from docs/readme_images/search-metrics.png rename to docs/src/readme_images/search-metrics.png diff --git a/docs/readme_images/siteground.png b/docs/src/readme_images/siteground.png similarity index 100% rename from docs/readme_images/siteground.png rename to docs/src/readme_images/siteground.png diff --git a/docs/readme_images/sports-authority.png b/docs/src/readme_images/sports-authority.png similarity index 100% rename from docs/readme_images/sports-authority.png rename to docs/src/readme_images/sports-authority.png diff --git a/docs/readme_images/stillwater.png b/docs/src/readme_images/stillwater.png similarity index 100% rename from docs/readme_images/stillwater.png rename to docs/src/readme_images/stillwater.png diff --git a/docs/readme_images/tailwind.png b/docs/src/readme_images/tailwind.png similarity index 100% rename from docs/readme_images/tailwind.png rename to docs/src/readme_images/tailwind.png diff --git a/docs/readme_images/talent-pair.png b/docs/src/readme_images/talent-pair.png similarity index 100% rename from docs/readme_images/talent-pair.png rename to docs/src/readme_images/talent-pair.png diff --git a/docs/simserver.rst b/docs/src/simserver.rst similarity index 100% rename from docs/simserver.rst rename to docs/src/simserver.rst diff --git a/docs/support.rst b/docs/src/support.rst similarity index 100% rename from docs/support.rst rename to docs/src/support.rst diff --git a/docs/tut1.rst b/docs/src/tut1.rst similarity index 100% rename from docs/tut1.rst rename to docs/src/tut1.rst diff --git a/docs/tut2.rst b/docs/src/tut2.rst similarity index 100% rename from docs/tut2.rst rename to docs/src/tut2.rst diff --git a/docs/tut3.rst b/docs/src/tut3.rst similarity index 100% rename from docs/tut3.rst rename to docs/src/tut3.rst diff --git a/docs/tutorial.rst b/docs/src/tutorial.rst similarity index 100% rename from docs/tutorial.rst rename to docs/src/tutorial.rst diff --git a/docs/user_guide.rst b/docs/src/user_guide.rst similarity index 100% rename from docs/user_guide.rst rename to docs/src/user_guide.rst diff --git a/docs/wiki.rst b/docs/src/wiki.rst similarity index 100% rename from docs/wiki.rst rename to docs/src/wiki.rst diff --git a/tox.ini b/tox.ini index 4d86335dd1..2a26b9291d 100644 --- a/tox.ini +++ b/tox.ini @@ -51,7 +51,7 @@ basepython = python2 recreate = True whitelist_externals = make deps = .[docs] -changedir = docs +changedir = docs/src commands = make clean html @@ -60,7 +60,7 @@ commands = make clean html recreate = True whitelist_externals = make deps = .[docs] -changedir = docs +changedir = docs/src commands = make clean html upload From 63d296c4012524d49cd5c11f29c927ff01fbe027 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 13:45:52 +0300 Subject: [PATCH 23/42] C Matutils --- docs/src/Makefile | 10 +++++----- docs/src/_matutils.rst | 9 --------- docs/src/apiref.rst | 27 +++++++++++++++++++++++++++ docs/src/modules/downloader.rst | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 14 deletions(-) delete mode 100644 docs/src/_matutils.rst create mode 100644 docs/src/modules/downloader.rst diff --git a/docs/src/Makefile b/docs/src/Makefile index 1cab7f3683..a8e8aba66a 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -65,13 +65,13 @@ htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." + ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/gensim.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/gensim.qhc" @@ -81,7 +81,7 @@ latex: @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ - "run these through (pdf)latex." + "run these through (pdf)latex." cd $(BUILDDIR)/latex && make all-pdf cp $(BUILDDIR)/latex/gensim.pdf ../gensim_manual.pdf @@ -94,9 +94,9 @@ linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." + "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/src/_matutils.rst b/docs/src/_matutils.rst deleted file mode 100644 index 13459a1bae..0000000000 --- a/docs/src/_matutils.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`_matutils` -- Cython matutils -=================================== - -.. automodule:: gensim._matutils - :synopsis: Cython math utils - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/apiref.rst b/docs/src/apiref.rst index 78921f4aad..36f9482152 100644 --- a/docs/src/apiref.rst +++ b/docs/src/apiref.rst @@ -480,3 +480,30 @@ Functions jaccard_distance dirichlet_expectation qr_destroy + +.. _c_matutils_ref: + +:mod:`gensim._matutils`: C Matutils +=================================== + +.. automodule:: gensim._matutils + :no-members: + :no-inherited-members: + +Classes +------- +.. currentmodule:: gensim._matutils + +.. autosummary:: + :toctree: generated/ + :template: class.rst + +Functions +--------- +.. currentmodule:: gensim._matutils + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + mean_absolute_difference diff --git a/docs/src/modules/downloader.rst b/docs/src/modules/downloader.rst new file mode 100644 index 0000000000..605790a0b2 --- /dev/null +++ b/docs/src/modules/downloader.rst @@ -0,0 +1,32 @@ +.. _downloader: + +========== +Downloader +========== + +Give information about available models/datasets:: + + >>> import gensim.downloader as api + >>> + >>> api.info() # return dict with info about available models/datasets + >>> api.info("text8") # return dict with info about "text8" dataset + +Model example:: + + >>> import gensim.downloader as api + >>> + >>> model = api.load("glove-twitter-25") # load glove vectors + >>> model.most_similar("cat") # show words that similar to word 'cat' + +Dataset example:: + + >>> import gensim.downloader as api + >>> from gensim.models import Word2Vec + >>> + >>> dataset = api.load("text8") # load dataset as iterable + >>> model = Word2Vec(dataset) # train w2v model + +Also, this API available via CLI:: + + python -m gensim.downloader --info # same as api.info(dataname) + python -m gensim.downloader --download # same as api.load(dataname, return_path=True) From 7b4e100de16934a1e36a29ce2448b3724f941894 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 14:48:12 +0300 Subject: [PATCH 24/42] Fix circleci path --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d40b687ef9..d2125123c3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -33,7 +33,7 @@ jobs: tox -e docs -vv - store_artifacts: - path: docs/_build + path: docs/src/_build destination: documentation - save_cache: From 52c39e982b885feb01527de4a98126fe0516f83b Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 14:51:10 +0300 Subject: [PATCH 25/42] Remove redundant examples --- examples/README.txt | 9 ----- examples/plot_downloader_api_tutorial.py | 48 ------------------------ 2 files changed, 57 deletions(-) delete mode 100644 examples/README.txt delete mode 100644 examples/plot_downloader_api_tutorial.py diff --git a/examples/README.txt b/examples/README.txt deleted file mode 100644 index 52e41b2613..0000000000 --- a/examples/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -.. _general_examples: - -Examples -======== - -General examples ----------------- - -General-purpose and introductory examples for gensim. \ No newline at end of file diff --git a/examples/plot_downloader_api_tutorial.py b/examples/plot_downloader_api_tutorial.py deleted file mode 100644 index 3df47630d0..0000000000 --- a/examples/plot_downloader_api_tutorial.py +++ /dev/null @@ -1,48 +0,0 @@ -# coding: utf-8 - -""" -Tutorial for using Gensim's API for downloading corpuses/models - -Let's start by importing the api module. -""" - -import logging -import gensim.downloader as api - -logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) - -# Now, lets download the text8 corpus and load it to memory (automatically) - -corpus = api.load('text8') - -# As the corpus has been downloaded and loaded, let's create a word2vec model of our corpus. - -from gensim.models.word2vec import Word2Vec - -model = Word2Vec(corpus) - -# Now that we have our word2vec model, let's find words that are similar to 'tree' - -model.most_similar('tree') - -# You can use the API to download many corpora and models. You can get the list of all the models and corpora that are provided, by using the code below: - -import json -data_list = api.info() -print(json.dumps(data_list, indent=4)) - -# If you want to get detailed information about the model/corpus, use: - -fake_news_info = api.info('fake-news') -print(json.dumps(fake_news_info, indent=4)) - -# Sometimes, you do not want to load the model to memory. You would just want to get the path to the model. For that, use : - -print(api.load('glove-wiki-gigaword-50', return_path=True)) - -# If you want to load the model to memory, then: - -model = api.load("glove-wiki-gigaword-50") -model.most_similar("glass") - -# In corpora, the corpus is never loaded to memory, all corpuses wrapped to special class `Dataset` and provide `__iter__` method From 357a468a3a545e128e12467f9ee1f815079c3645 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 14:52:36 +0300 Subject: [PATCH 26/42] Convert tabs to spaces --- docs/src/Makefile | 116 +++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/docs/src/Makefile b/docs/src/Makefile index a8e8aba66a..df63d353b4 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -18,85 +18,85 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: - -rm -rf $(BUILDDIR)/* - -rm -rf generated/* - -rm -rf modules/generated/ - -rm -rf auto_examples/* + -rm -rf $(BUILDDIR)/* + -rm -rf generated/* + -rm -rf modules/generated/ + -rm -rf auto_examples/* html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - rm -r $(BUILDDIR)/html/_sources - cp -r $(BUILDDIR)/html/* . - @echo - @echo "Build finished. The HTML pages are in /docs/src" + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + rm -r $(BUILDDIR)/html/_sources + cp -r $(BUILDDIR)/html/* . + @echo + @echo "Build finished. The HTML pages are in /docs/src" upload: - scp -r _build/html/* rr:public_html/gensim/ + scp -r _build/html/* rr:public_html/gensim/ dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/gensim.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/gensim.qhc" + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/gensim.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/gensim.qhc" latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ - "run these through (pdf)latex." - cd $(BUILDDIR)/latex && make all-pdf - cp $(BUILDDIR)/latex/gensim.pdf ../gensim_manual.pdf + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + cd $(BUILDDIR)/latex && make all-pdf + cp $(BUILDDIR)/latex/gensim.pdf ../gensim_manual.pdf changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." From b100d860f46d03a7092afcb8861033d0cb80eaa9 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 14:56:15 +0300 Subject: [PATCH 27/42] Change line endings --- docs/src/_static/js/jquery-migrate-1.1.1.min.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/_static/js/jquery-migrate-1.1.1.min.js b/docs/src/_static/js/jquery-migrate-1.1.1.min.js index 455be558e1..eb3ecb1b3d 100644 --- a/docs/src/_static/js/jquery-migrate-1.1.1.min.js +++ b/docs/src/_static/js/jquery-migrate-1.1.1.min.js @@ -1 +1,3 @@ -/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); //@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file +/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ +jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); +//@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file From 57c5dd3cfbf3a7bd3f9e6b6ee8d5926df8fa5abc Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 15:04:00 +0300 Subject: [PATCH 28/42] Revert "Change line endings" This reverts commit b100d860f46d03a7092afcb8861033d0cb80eaa9. --- docs/src/_static/js/jquery-migrate-1.1.1.min.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/src/_static/js/jquery-migrate-1.1.1.min.js b/docs/src/_static/js/jquery-migrate-1.1.1.min.js index eb3ecb1b3d..455be558e1 100644 --- a/docs/src/_static/js/jquery-migrate-1.1.1.min.js +++ b/docs/src/_static/js/jquery-migrate-1.1.1.min.js @@ -1,3 +1 @@ -/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ -jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); -//@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file +/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); //@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file From be0917e4f04b9fb15dab5770a003288280415cd6 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 15:07:57 +0300 Subject: [PATCH 29/42] Fix line endings (probably) --- docs/src/_static/js/jquery-migrate-1.1.1.min.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/_static/js/jquery-migrate-1.1.1.min.js b/docs/src/_static/js/jquery-migrate-1.1.1.min.js index 455be558e1..eb3ecb1b3d 100644 --- a/docs/src/_static/js/jquery-migrate-1.1.1.min.js +++ b/docs/src/_static/js/jquery-migrate-1.1.1.min.js @@ -1 +1,3 @@ -/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); //@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file +/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ +jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); +//@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file From 541378e14433070293f67150290ee832e5ecea55 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 15:30:58 +0300 Subject: [PATCH 30/42] Fix --- docs/src/Makefile | 116 ++++++++++++++-------------- gensim/models/tfidfmodel.py | 2 +- gensim/models/translation_matrix.py | 3 +- 3 files changed, 61 insertions(+), 60 deletions(-) diff --git a/docs/src/Makefile b/docs/src/Makefile index df63d353b4..a8e8aba66a 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -18,85 +18,85 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: - -rm -rf $(BUILDDIR)/* - -rm -rf generated/* - -rm -rf modules/generated/ - -rm -rf auto_examples/* + -rm -rf $(BUILDDIR)/* + -rm -rf generated/* + -rm -rf modules/generated/ + -rm -rf auto_examples/* html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - rm -r $(BUILDDIR)/html/_sources - cp -r $(BUILDDIR)/html/* . - @echo - @echo "Build finished. The HTML pages are in /docs/src" + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + rm -r $(BUILDDIR)/html/_sources + cp -r $(BUILDDIR)/html/* . + @echo + @echo "Build finished. The HTML pages are in /docs/src" upload: - scp -r _build/html/* rr:public_html/gensim/ + scp -r _build/html/* rr:public_html/gensim/ dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/gensim.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/gensim.qhc" + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/gensim.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/gensim.qhc" latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ - "run these through (pdf)latex." - cd $(BUILDDIR)/latex && make all-pdf - cp $(BUILDDIR)/latex/gensim.pdf ../gensim_manual.pdf + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + cd $(BUILDDIR)/latex && make all-pdf + cp $(BUILDDIR)/latex/gensim.pdf ../gensim_manual.pdf changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/gensim/models/tfidfmodel.py b/gensim/models/tfidfmodel.py index 96eb140a11..a170e15eff 100644 --- a/gensim/models/tfidfmodel.py +++ b/gensim/models/tfidfmodel.py @@ -27,7 +27,7 @@ def resolve_weights(smartirs): Information Retrieval System, a mnemonic scheme for denoting tf-idf weighting variants in the vector space model. The mnemonic for representing a combination of weights takes the form ddd, where the letters represents the term weighting of the document vector. - for more information visit [1]. + for more information visit `SMART_Information_Retrieval_System `. Returns ------- diff --git a/gensim/models/translation_matrix.py b/gensim/models/translation_matrix.py index 5be93a8358..c8bd19f8f7 100644 --- a/gensim/models/translation_matrix.py +++ b/gensim/models/translation_matrix.py @@ -267,7 +267,8 @@ def translate(self, source_words, topn=5, gc=0, sample_num=None, source_lang_vec Number of words than will be returned as translation for each `source_words` gc : int, optional Define the translation algorithm, if `gc == 0` - use standard NN retrieval, - otherwise, use globally corrected neighbour retrieval method (as described in [1]). + otherwise, use globally corrected neighbour retrieval method (as described in `Improving zero-shot learning by mitigating the + hubness problem `). sample_num : int, optional Number of word to sample from the source lexicon, if `gc == 1`, then `sample_num` **must** be provided. source_lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors`, optional From b16c392a15b13c8ec3e819874080316286860808 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 15:35:13 +0300 Subject: [PATCH 31/42] Fix awkward docstring --- gensim/models/wrappers/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/models/wrappers/__init__.py b/gensim/models/wrappers/__init__.py index 8a5250acd3..b585e61e31 100644 --- a/gensim/models/wrappers/__init__.py +++ b/gensim/models/wrappers/__init__.py @@ -1,5 +1,5 @@ """ -Wrappers for other topic modeling programs. +Wrappers for external distibutional semantic libraries. """ from .ldamallet import LdaMallet # noqa:F401 From 7313d2acd8624c24887442fcffb070b670359b0d Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sat, 24 Feb 2018 15:41:07 +0300 Subject: [PATCH 32/42] Fix references --- gensim/models/tfidfmodel.py | 2 +- gensim/summarization/summarizer.py | 2 +- gensim/utils.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gensim/models/tfidfmodel.py b/gensim/models/tfidfmodel.py index a170e15eff..1179599ead 100644 --- a/gensim/models/tfidfmodel.py +++ b/gensim/models/tfidfmodel.py @@ -272,7 +272,7 @@ def __init__(self, corpus=None, id2word=None, dictionary=None, wlocal=utils.iden * `n` - none, * `c` - cosine. - For more information visit [1]. + For more information visit ``. """ diff --git a/gensim/summarization/summarizer.py b/gensim/summarization/summarizer.py index ee5290e85b..349edb881e 100644 --- a/gensim/summarization/summarizer.py +++ b/gensim/summarization/summarizer.py @@ -323,7 +323,7 @@ def _build_hasheable_corpus(corpus): def summarize_corpus(corpus, ratio=0.2): """Get a list of the most important documents of a corpus using a - variation of the TextRank algorithm [1]. + variation of the `TextRank algorithm`. Used as helper for summarize :func:`~gensim.summarization.summarizer.summarizer` diff --git a/gensim/utils.py b/gensim/utils.py index b217795252..0b52f6b7fb 100644 --- a/gensim/utils.py +++ b/gensim/utils.py @@ -1543,7 +1543,7 @@ def pyro_daemon(name, obj, random_suffix=False, ip=None, port=None, ns_conf=None def has_pattern(): - """Check that `pattern` [5] package already installed. + """Check if `pattern ` package is already installed. Returns ------- @@ -1564,7 +1564,7 @@ def has_pattern(): def lemmatize(content, allowed_tags=re.compile(r'(NN|VB|JJ|RB)'), light=False, stopwords=frozenset(), min_length=2, max_length=15): - """Use the English lemmatizer from `pattern` [5] to extract UTF8-encoded tokens in + """Use the English lemmatizer from `pattern ` to extract UTF8-encoded tokens in their base form=lemma, e.g. "are, is, being" -> "be" etc. This is a smarter version of stemming, taking word context into account. From a08fac96579e812a8389315545fbc3961a954ca8 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sun, 25 Feb 2018 14:24:19 +0300 Subject: [PATCH 33/42] Fix redundant copying of .html --- docs/src/Makefile | 3 +-- docs/src/_static/js/jquery-migrate-1.1.1.min.js | 2 +- gensim/summarization/summarizer.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/src/Makefile b/docs/src/Makefile index a8e8aba66a..286efa187a 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -39,9 +39,8 @@ clean: html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html rm -r $(BUILDDIR)/html/_sources - cp -r $(BUILDDIR)/html/* . @echo - @echo "Build finished. The HTML pages are in /docs/src" + @echo "Build finished. The HTML pages are in /docs" upload: scp -r _build/html/* rr:public_html/gensim/ diff --git a/docs/src/_static/js/jquery-migrate-1.1.1.min.js b/docs/src/_static/js/jquery-migrate-1.1.1.min.js index eb3ecb1b3d..759f35e857 100644 --- a/docs/src/_static/js/jquery-migrate-1.1.1.min.js +++ b/docs/src/_static/js/jquery-migrate-1.1.1.min.js @@ -1,3 +1,3 @@ -/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ +/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); //@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file diff --git a/gensim/summarization/summarizer.py b/gensim/summarization/summarizer.py index 349edb881e..246fe1642c 100644 --- a/gensim/summarization/summarizer.py +++ b/gensim/summarization/summarizer.py @@ -347,7 +347,7 @@ def summarize_corpus(corpus, ratio=0.2): References ---------- - .. [1] Federico Barrios, Federico L´opez, Luis Argerich, Rosita Wachenchauzer (2016). + .. [] Federico Barrios, Federico L´opez, Luis Argerich, Rosita Wachenchauzer (2016). Variations of the Similarity Function of TextRank for Automated Summarization, https://arxiv.org/abs/1602.03606 From c6109589e53c5ac2a57f95b76631689ee4307799 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Sun, 25 Feb 2018 15:37:28 +0300 Subject: [PATCH 34/42] Fix flake8 --- gensim/models/tfidfmodel.py | 3 ++- gensim/models/translation_matrix.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gensim/models/tfidfmodel.py b/gensim/models/tfidfmodel.py index 1179599ead..89d0d9c69c 100644 --- a/gensim/models/tfidfmodel.py +++ b/gensim/models/tfidfmodel.py @@ -27,7 +27,8 @@ def resolve_weights(smartirs): Information Retrieval System, a mnemonic scheme for denoting tf-idf weighting variants in the vector space model. The mnemonic for representing a combination of weights takes the form ddd, where the letters represents the term weighting of the document vector. - for more information visit `SMART_Information_Retrieval_System `. + for more information visit `SMART_Information_Retrieval_System `. Returns ------- diff --git a/gensim/models/translation_matrix.py b/gensim/models/translation_matrix.py index c8bd19f8f7..7b2cb3b4ff 100644 --- a/gensim/models/translation_matrix.py +++ b/gensim/models/translation_matrix.py @@ -267,8 +267,8 @@ def translate(self, source_words, topn=5, gc=0, sample_num=None, source_lang_vec Number of words than will be returned as translation for each `source_words` gc : int, optional Define the translation algorithm, if `gc == 0` - use standard NN retrieval, - otherwise, use globally corrected neighbour retrieval method (as described in `Improving zero-shot learning by mitigating the - hubness problem `). + otherwise, use globally corrected neighbour retrieval method (as described in `Improving zero-shot learning + by mitigating the hubness problem `). sample_num : int, optional Number of word to sample from the source lexicon, if `gc == 1`, then `sample_num` **must** be provided. source_lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors`, optional From 73138083b37926691fd4b90d985c9737856e9165 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 27 Feb 2018 23:21:33 +0300 Subject: [PATCH 35/42] Add arrows and unify Workers and Dispatchers --- docs/src/apiref.rst | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/docs/src/apiref.rst b/docs/src/apiref.rst index 36f9482152..beea334d4b 100644 --- a/docs/src/apiref.rst +++ b/docs/src/apiref.rst @@ -14,7 +14,7 @@ API Reference :no-members: :no-inherited-members: -Document -> Vector +Document ➔ Vector ------------------ .. currentmodule:: gensim.models @@ -31,7 +31,7 @@ Document -> Vector atmodel.AuthorTopicModel doc2vec.Doc2Vec -Word -> Vector +Word ➔ Vector -------------- .. currentmodule:: gensim.models @@ -55,26 +55,18 @@ Utils coherencemodel.CoherenceModel basemodel.BaseTopicModel -Workers -------- -.. currentmodule:: gensim.models - -.. autosummary:: - :toctree: generated/ - :template: class.rst - - lsi_worker.Worker - lda_worker.Worker - -Dispatchers +Distributed ----------- + .. currentmodule:: gensim.models .. autosummary:: :toctree: generated/ :template: class.rst + lsi_worker.Worker lsi_dispatcher.Dispatcher + lda_worker.Worker lda_dispatcher.Dispatcher Wrappers From 18b8b15ed6711715a80c87b9565d3e548cc3f238 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 27 Feb 2018 23:45:32 +0300 Subject: [PATCH 36/42] Add example example :) --- docs/examples/README.txt | 12 +++++++ docs/examples/plot_downloader_api_tutorial.py | 36 +++++++++++++++++++ docs/src/Makefile | 1 - docs/src/conf.py | 3 +- gensim/matutils.py | 2 ++ 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 docs/examples/README.txt create mode 100644 docs/examples/plot_downloader_api_tutorial.py diff --git a/docs/examples/README.txt b/docs/examples/README.txt new file mode 100644 index 0000000000..c145b7728c --- /dev/null +++ b/docs/examples/README.txt @@ -0,0 +1,12 @@ +.. _examples-index: + +Gallery of Examples +=================== + + +.. _general_examples: + +General examples +---------------- + +General-purpose and introductory examples from the gensim diff --git a/docs/examples/plot_downloader_api_tutorial.py b/docs/examples/plot_downloader_api_tutorial.py new file mode 100644 index 0000000000..56f9b5e615 --- /dev/null +++ b/docs/examples/plot_downloader_api_tutorial.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" +EXAMPLE EXAMPLE +=============== + +TO BE REPLACED WITH A REAL EXAMPLE +""" + +########################################################################### +# Here's our imports: + +import numpy as np +import matplotlib.pyplot as plt + +########################################################################### +# Here's the first graph: + +x = np.linspace(-1, 2, 100) +y = np.exp(x) + +plt.figure() +plt.plot(x, y) +plt.xlabel('$x$') +plt.ylabel('$\exp(x)$') + +plt.show() + +########################################################################### +# And here's the second one: + +plt.figure() +plt.plot(x, -np.exp(-x)) +plt.xlabel('$x$') +plt.ylabel('$-\exp(-x)$') + +plt.show() diff --git a/docs/src/Makefile b/docs/src/Makefile index 286efa187a..218c44b897 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -38,7 +38,6 @@ clean: html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - rm -r $(BUILDDIR)/html/_sources @echo @echo "Build finished. The HTML pages are in /docs" diff --git a/docs/src/conf.py b/docs/src/conf.py index 481a8b4add..0d476140fb 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -32,6 +32,7 @@ 'sphinx.ext.autosummary', 'sphinx.ext.napoleon', 'sphinx.ext.imgmath', + 'sphinx_gallery.gen_gallery', 'sphinxcontrib.programoutput', ] autoclass_content = "both" @@ -57,7 +58,7 @@ 'doc_module': 'gensim', 'backreferences_dir': os.path.join('modules', 'generated'), 'reference_url': {'gensim': None}, - 'plot_gallery': False, + 'plot_gallery': True, } # The master toctree document. diff --git a/gensim/matutils.py b/gensim/matutils.py index 7827e3de1e..f8332d3abd 100644 --- a/gensim/matutils.py +++ b/gensim/matutils.py @@ -640,6 +640,8 @@ def ret_normalized_vec(vec, length): def ret_log_normalize_vec(vec, axis=1): + #TODO: Write docstring + log_max = 100.0 if len(vec.shape) == 1: max_val = np.max(vec) From f0588797cb7a34349b85e6aa76fb8e2ef95bab71 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 27 Feb 2018 23:51:23 +0300 Subject: [PATCH 37/42] Add soft cosine similarity --- docs/src/apiref.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/apiref.rst b/docs/src/apiref.rst index beea334d4b..55d071e7ec 100644 --- a/docs/src/apiref.rst +++ b/docs/src/apiref.rst @@ -191,6 +191,7 @@ Classes docsim.Shard docsim.Similarity docsim.MatrixSimilarity + docsim.SoftCosineSimilarity docsim.SparseMatrixSimilarity index.AnnoyIndexer From 05e99796c9407ca78bd1b2dfb417145b3362dd50 Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Tue, 27 Feb 2018 23:54:18 +0300 Subject: [PATCH 38/42] Fix models docstring --- gensim/models/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/models/__init__.py b/gensim/models/__init__.py index e0bcedf29f..dd4b346db2 100644 --- a/gensim/models/__init__.py +++ b/gensim/models/__init__.py @@ -1,4 +1,4 @@ -"""Extraction of documents representations from their raw bag-of-word counts.""" +"""Documents and words representations.""" # bring model classes directly into package namespace, to save some typing from .coherencemodel import CoherenceModel # noqa:F401 From 2a98a19b54648bcdb7b7e3bac6bfed89aaf1d10d Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 2 Mar 2018 19:45:48 +0300 Subject: [PATCH 39/42] Fix backticks bug --- gensim/matutils.py | 8 ++++---- gensim/utils.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gensim/matutils.py b/gensim/matutils.py index f8332d3abd..42f3beb501 100644 --- a/gensim/matutils.py +++ b/gensim/matutils.py @@ -221,7 +221,7 @@ def zeros_aligned(shape, dtype, order='C', align=128): def ismatrix(m): - """Check does `m` numpy.ndarray or `scipy.sparse` matrix. + """Check does `m` `numpy.ndarray` or `scipy.sparse` matrix. Parameters ---------- @@ -238,7 +238,7 @@ def ismatrix(m): def any2sparse(vec, eps=1e-9): - """Convert a numpy.ndarray or `scipy.sparse` vector into gensim BoW format. + """Convert a `numpy.ndarray` or `scipy.sparse` vector into gensim BoW format. Parameters ---------- @@ -315,7 +315,7 @@ def scipy2scipy_clipped(matrix, topn, eps=1e-9): def scipy2sparse(vec, eps=1e-9): - """Convert a scipy.sparse vector BoW format. + """Convert a `scipy.sparse` vector BoW format. Parameters ---------- @@ -538,7 +538,7 @@ def __len__(self): class Sparse2Corpus(object): - """Convert a matrix in scipy.sparse format into a streaming gensim corpus. + """Convert a matrix in `scipy.sparse` format into a streaming gensim corpus. See Also -------- diff --git a/gensim/utils.py b/gensim/utils.py index 0b52f6b7fb..174b7aae29 100644 --- a/gensim/utils.py +++ b/gensim/utils.py @@ -1833,7 +1833,7 @@ def sample_dict(d, n=10, use_random=True): def strided_windows(ndarray, window_size): - """Produce a numpy.ndarray of windows, as from a sliding window. + """Produce a `numpy.ndarray` of windows, as from a sliding window. Parameters ---------- From 47634598df45126d7c8205fe71e6dce3c95e4b9f Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 2 Mar 2018 19:50:11 +0300 Subject: [PATCH 40/42] Add C Matutils --- docs/src/apiref.rst | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/src/apiref.rst b/docs/src/apiref.rst index 55d071e7ec..24a3d6de5e 100644 --- a/docs/src/apiref.rst +++ b/docs/src/apiref.rst @@ -483,14 +483,6 @@ Functions :no-members: :no-inherited-members: -Classes -------- -.. currentmodule:: gensim._matutils - -.. autosummary:: - :toctree: generated/ - :template: class.rst - Functions --------- .. currentmodule:: gensim._matutils @@ -500,3 +492,8 @@ Functions :template: function.rst mean_absolute_difference + logsumexp + dirichlet_expectation + dirichlet_expectation_1d + dirichlet_expectation_2d + digamma From 736959709887d72c209a8215c80d0c4efefeffcf Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Fri, 2 Mar 2018 22:09:52 +0300 Subject: [PATCH 41/42] Refine scripts reference| --- docs/src/Makefile | 2 +- docs/src/_templates/module.rst | 11 +++++++++++ docs/src/apiref.rst | 36 +++++++++++++++++++++++----------- 3 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 docs/src/_templates/module.rst diff --git a/docs/src/Makefile b/docs/src/Makefile index 218c44b897..4c734411a8 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -39,7 +39,7 @@ clean: html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo - @echo "Build finished. The HTML pages are in /docs" + @echo "Build finished. The HTML pages are in /docs/src/_build/html" upload: scp -r _build/html/* rr:public_html/gensim/ diff --git a/docs/src/_templates/module.rst b/docs/src/_templates/module.rst new file mode 100644 index 0000000000..647629dbd4 --- /dev/null +++ b/docs/src/_templates/module.rst @@ -0,0 +1,11 @@ +:mod:`{{module}}`.{{objname}} +{{ underline }}============== + +.. currentmodule:: {{ module }} + +.. automodule:: {{module}}.{{objname}} + :members: + +.. raw:: html + +
diff --git a/docs/src/apiref.rst b/docs/src/apiref.rst index 24a3d6de5e..85ba505d45 100644 --- a/docs/src/apiref.rst +++ b/docs/src/apiref.rst @@ -115,21 +115,36 @@ Functions :no-members: :no-inherited-members: -Functions ---------- +Scripts +------- .. currentmodule:: gensim.scripts .. autosummary:: :toctree: generated/ - :template: function.rst + :template: module.rst + + glove2word2vec + +.. command-output:: python -m gensim.scripts.glove2word2vec --help + :ellipsis: 0, -5 + +.. autosummary:: + :toctree: generated/ + :template: module.rst + + word2vec2tensor + +.. command-output:: python -m gensim.scripts.word2vec2tensor --help + :ellipsis: 0, -7 + +.. autosummary:: + :toctree: generated/ + :template: module.rst + + segment_wiki - glove2word2vec.get_glove_info - glove2word2vec.glove2word2vec - word2vec2tensor.word2vec2tensor - segment_wiki.segment_all_articles - segment_wiki.segment_and_write_all_articles - segment_wiki.extract_page_xmls - segment_wiki.segment +.. command-output:: python -m gensim.scripts.segment_wiki --help + :ellipsis: 0, -10 .. _corpora_ref: @@ -496,4 +511,3 @@ Functions dirichlet_expectation dirichlet_expectation_1d dirichlet_expectation_2d - digamma From aff50e978d1a5f48713e3815bfe39da1a3b5950f Mon Sep 17 00:00:00 2001 From: Timofey Yefimov Date: Wed, 27 Jun 2018 15:57:46 +0300 Subject: [PATCH 42/42] Remove redundant rsts --- docs/src/models/_utils_any2vec.rst | 9 --------- docs/src/models/base_any2vec.rst | 10 ---------- docs/src/models/doc2vec_inner.rst | 9 --------- docs/src/models/fasttext_inner.rst | 9 --------- docs/src/models/utils_any2vec.rst | 9 --------- docs/src/models/word2vec_inner.rst | 9 --------- 6 files changed, 55 deletions(-) delete mode 100644 docs/src/models/_utils_any2vec.rst delete mode 100644 docs/src/models/base_any2vec.rst delete mode 100644 docs/src/models/doc2vec_inner.rst delete mode 100644 docs/src/models/fasttext_inner.rst delete mode 100644 docs/src/models/utils_any2vec.rst delete mode 100644 docs/src/models/word2vec_inner.rst diff --git a/docs/src/models/_utils_any2vec.rst b/docs/src/models/_utils_any2vec.rst deleted file mode 100644 index 46e5541ec3..0000000000 --- a/docs/src/models/_utils_any2vec.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models._utils_any2vec` -- Cython utils for any2vec models -=============================================================== - -.. automodule:: gensim.models._utils_any2vec - :synopsis: Cython utils for any2vec models - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/base_any2vec.rst b/docs/src/models/base_any2vec.rst deleted file mode 100644 index e6685cda66..0000000000 --- a/docs/src/models/base_any2vec.rst +++ /dev/null @@ -1,10 +0,0 @@ -:mod:`models.base_any2vec` -- Base classes for any2vec models -============================================================= - -.. automodule:: gensim.models.base_any2vec - :synopsis: Base classes for any2vec models - :members: - :inherited-members: - :special-members: __getitem__ - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/doc2vec_inner.rst b/docs/src/models/doc2vec_inner.rst deleted file mode 100644 index 92e7cf8628..0000000000 --- a/docs/src/models/doc2vec_inner.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.doc2vec_inner` -- Cython routines for training Doc2Vec models -========================================================================== - -.. automodule:: gensim.models.doc2vec_inner - :synopsis: Optimized Cython routines for training Doc2Vec models - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/fasttext_inner.rst b/docs/src/models/fasttext_inner.rst deleted file mode 100644 index 4c5a1b1f65..0000000000 --- a/docs/src/models/fasttext_inner.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.fasttext_inner` -- Cython routines for training FastText models -============================================================================ - -.. automodule:: gensim.models.fasttext_inner - :synopsis: Optimized Cython routines for training FastText models - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/utils_any2vec.rst b/docs/src/models/utils_any2vec.rst deleted file mode 100644 index 123ee265e6..0000000000 --- a/docs/src/models/utils_any2vec.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.utils_any2vec` -- Utils for any2vec models -======================================================= - -.. automodule:: gensim.models.utils_any2vec - :synopsis: Utils for any2vec models - :members: - :inherited-members: - :undoc-members: - :show-inheritance: diff --git a/docs/src/models/word2vec_inner.rst b/docs/src/models/word2vec_inner.rst deleted file mode 100644 index 857b9fc1dd..0000000000 --- a/docs/src/models/word2vec_inner.rst +++ /dev/null @@ -1,9 +0,0 @@ -:mod:`models.word2vec_inner` -- Cython routines for training Word2Vec models -============================================================================ - -.. automodule:: gensim.models.word2vec_inner - :synopsis: Optimized Cython routines for training Word2Vec models - :members: - :inherited-members: - :undoc-members: - :show-inheritance: