From f2ac3a9f4280b0b86b89f0320e50abf8b4eedc74 Mon Sep 17 00:00:00 2001 From: Lev Konstantinovskiy Date: Fri, 6 Nov 2015 15:38:48 +0000 Subject: [PATCH 01/33] Update CHANGELOG.txt --- CHANGELOG.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f1e13f5365..684384355f 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,7 +1,7 @@ Changes ======= -0.12.3rc1, 05/11/2015 +0.12.3, 05/11/2015 * Make show_topics return value consistent across models (Christopher Corley, #448) - All models with the `show_topics` method should return a list of From cf09e8c04a5978a4d678d093864ce592b240995f Mon Sep 17 00:00:00 2001 From: Lev Konstantinovskiy Date: Fri, 6 Nov 2015 15:39:01 +0000 Subject: [PATCH 02/33] Update CHANGELOG.txt --- CHANGELOG.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 684384355f..8cbd78c213 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,7 +1,7 @@ Changes ======= -0.12.3, 05/11/2015 +0.12.3, 06/11/2015 * Make show_topics return value consistent across models (Christopher Corley, #448) - All models with the `show_topics` method should return a list of From b8b8f5724323434235c6e016b5949252f1725abb Mon Sep 17 00:00:00 2001 From: akutuzov Date: Mon, 23 Nov 2015 02:31:18 +0100 Subject: [PATCH 03/33] cbow_mean default changed from 0 to 1. --- gensim/models/word2vec.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index c4bfbf64a8..a103754d10 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -337,7 +337,7 @@ class Word2Vec(utils.SaveLoad): def __init__( self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0, seed=1, workers=1, min_alpha=0.0001, - sg=1, hs=1, negative=0, cbow_mean=0, hashfxn=hash, iter=1, null_word=0, + sg=1, hs=1, negative=0, cbow_mean=1, hashfxn=hash, iter=1, null_word=0, trim_rule=None, sorted_vocab=1): """ Initialize the model from an iterable of `sentences`. Each sentence is a @@ -379,7 +379,7 @@ def __init__( `negative` = if > 0, negative sampling will be used, the int for negative specifies how many "noise words" should be drawn (usually between 5-20). - `cbow_mean` = if 0 (default), use the sum of the context word vectors. If 1, use the mean. + `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used. `hashfxn` = hash function to use to randomly initialize weights, for increased From 6456cbcd75e6f8720451766ba31cc046b4463ae2 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 13 Jan 2016 14:41:49 +0100 Subject: [PATCH 04/33] Hyperparameters' default values are aligned with Mikolov's word2vec. --- gensim/models/word2vec.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index a103754d10..340ff053d5 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -336,8 +336,8 @@ class Word2Vec(utils.SaveLoad): """ def __init__( self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, - max_vocab_size=None, sample=0, seed=1, workers=1, min_alpha=0.0001, - sg=1, hs=1, negative=0, cbow_mean=1, hashfxn=hash, iter=1, null_word=0, + max_vocab_size=None, sample=1e-3, seed=1, workers=12, min_alpha=0.0001, + sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, trim_rule=None, sorted_vocab=1): """ Initialize the model from an iterable of `sentences`. Each sentence is a @@ -351,8 +351,8 @@ def __init__( If you don't supply `sentences`, the model is left uninitialized -- use if you plan to initialize it in some other way. - `sg` defines the training algorithm. By default (`sg=1`), skip-gram is used. - Otherwise, `cbow` is employed. + `sg` defines the training algorithm. By default (`sg=0`), CBOW is used. + Otherwise (`sg=1`), SkipGram is employed. `size` is the dimensionality of the feature vectors. @@ -370,14 +370,15 @@ def __init__( need about 1GB of RAM. Set to `None` for no limit (default). `sample` = threshold for configuring which higher-frequency words are randomly downsampled; - default is 0 (off), useful value is 1e-5. + default is 1e-3, useful value is 1e-5, 0 stands for off. `workers` = use this many worker threads to train the model (=faster training with multicore machines). - `hs` = if 1 (default), hierarchical sampling will be used for model training (else set to 0). + `hs` = if 1, hierarchical sampling will be used for model training (default is set to 0, thus negative sampling is used). `negative` = if > 0, negative sampling will be used, the int for negative specifies how many "noise words" should be drawn (usually between 5-20). + Default is 5. `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used. From d9ec7e44d67593329532e9e2a608fb53a7a6e5de Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 13 Jan 2016 16:23:16 +0100 Subject: [PATCH 05/33] Fix for #538: cbow_mean default changed from 0 to 1. --- gensim/models/word2vec.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 340ff053d5..5f84485da3 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -337,7 +337,7 @@ class Word2Vec(utils.SaveLoad): def __init__( self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=1e-3, seed=1, workers=12, min_alpha=0.0001, - sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, + sg=0, hs=1, negative=0, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, trim_rule=None, sorted_vocab=1): """ Initialize the model from an iterable of `sentences`. Each sentence is a @@ -374,11 +374,11 @@ def __init__( `workers` = use this many worker threads to train the model (=faster training with multicore machines). - `hs` = if 1, hierarchical sampling will be used for model training (default is set to 0, thus negative sampling is used). + `hs` = if 1 (default), hierarchical sampling will be used for model training (if set to 0, negative sampling will be used). `negative` = if > 0, negative sampling will be used, the int for negative specifies how many "noise words" should be drawn (usually between 5-20). - Default is 5. + Default is 0, thus hierarchical softmax is used. `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used. From 76d2df71006e776bd6758ea44373ac50de127a1b Mon Sep 17 00:00:00 2001 From: Andrey Kutuzov Date: Wed, 13 Jan 2016 16:36:00 +0100 Subject: [PATCH 06/33] Update changelog --- CHANGELOG.txt | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 1638c78960..11268a28fb 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,15 +1,29 @@ Changes ======= -<<<<<<< HEAD -* Loading of pattern library in utils.py is only in lemmatize function (Jan Zikes, #461) - - utils.HAS_PATTERN, has also changed to utils.has_pattern() -* Word2vec allows non-strict unicode error handling (ignore or replace). (Gordon Mohr, #466) +0.12.4, XX/XX/XXXX + +* load_word2vec_format() performance (@svenkreiss, #555) + - Remove `init_sims()` call for performance improvements when normalized vectors are not needed. + - Remove `norm_only` parameter (API change). Call `init_sims(replace=True)` after the `load_word2vec_format()` call for the old `norm_only=True` behavior. +* Better internal handling of job batching in word2vec (#535) + - up to 300% speed up when training on very short documents (~tweets) +* Word2vec allows non-strict unicode error handling (ignore or replace) (Gordon Mohr, #466) +* On-demand loading of the `pattern` library in utils.lemmatize (Jan Zikes, #461) + - `utils.HAS_PATTERN` flag moved to `utils.has_pattern()` +* Forwards compatibility for NumPy > 1.10 (Matti Lyra, #494, #513) + - LdaModel and LdaMulticore produce a large number of DeprecationWarnings from + .inference() because the term ids in each chunk returned from utils.grouper + are floats. This behaviour has been changed so that the term IDs are now ints. + - utils.grouper returns a python list instead of a numpy array in .update() when + LdaModel is called in non distributed mode + - in distributed mode .update() will still call utils.grouper with as_numpy=True + to save memory + - LdaModel.update and LdaMulticore.update have a new keyword parameter + chunks_as_numpy=True/False (defaults to False) that allows controlling + this behaviour 0.12.3, 05/11/2015 -======= -0.12.3, 06/11/2015 ->>>>>>> upstream/master * Make show_topics return value consistent across models (Christopher Corley, #448) - All models with the `show_topics` method should return a list of @@ -29,18 +43,6 @@ Changes * OSX wheels (#504) * Win build (#492) -* Forwards compatibility for NumPy > 1.10 (Matti Lyra, #494) - - LdaModel and LdaMulticore produce a large number of DepracationWarnings from - .inference() because the term ids in each chunk returned from utils.grouper - are floats. This behaviour has been changed so that the term IDs are now ints. - - utils.grouper returns a python list instead of a numpy array in .update() when - LdaModel is called in non distributed mode - - in distributed mode .update() will still call utils.grouper with as_numpy=True - to save memory - - LdaModel.update and LdaMulticore.update have a new keyword parameter - chunks_as_numpy=True/False (defaults to False) that allows controlling - this behaviour. - 0.12.2, 19/09/2015 * tutorial on text summarization (Ólavur Mortensen, #436) From 0b6f45b72a3c299d02f6655b9bc19449f53e9fe6 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Thu, 14 Jan 2016 01:17:11 +0100 Subject: [PATCH 07/33] (main) defaults aligned to Mikolov's word2vec. --- gensim/models/word2vec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 5f84485da3..c6765a4714 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -1605,7 +1605,7 @@ def __iter__(self): seterr(all='raise') # don't ignore numpy errors # model = Word2Vec(LineSentence(infile), size=200, min_count=5, workers=4) - model = Word2Vec(Text8Corpus(infile), size=200, min_count=5, workers=1) + model = Word2Vec(Text8Corpus(infile), size=100, min_count=5, workers=12, window=5,sample=1e-3,sg=0,hs=0,negative=5,cbow_mean=1,iter=5) if len(sys.argv) > 3: outfile = sys.argv[3] From bc7a44781059295ff431e64c28f350e27d9e466b Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 14 Jan 2016 19:17:53 +0100 Subject: [PATCH 08/33] word2vec (main) now mimics command-line arguments for Mikolov's word2vec. --- gensim/models/word2vec.py | 488 ++++++++++++++++++----------------- gensim/test/test_word2vec.py | 48 ++-- 2 files changed, 271 insertions(+), 265 deletions(-) mode change 100644 => 100755 gensim/models/word2vec.py diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py old mode 100644 new mode 100755 index e0c2469ff0..559dceab3c --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -59,7 +59,7 @@ where "words" are actually multiword expressions, such as `new_york_times` or `financial_crisis`: >>> bigram_transformer = gensim.models.Phrases(sentences) ->>> model = Word2Vec(bigram_transformer[sentences], size=100, ...) +>>> model = Word2Vec(bigram_transformed[sentences], size=100, ...) .. [1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013. .. [2] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their Compositionality. @@ -94,70 +94,64 @@ from six.moves import xrange from types import GeneratorType -logger = logging.getLogger(__name__) +logger = logging.getLogger("gensim.models.word2vec") try: - from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow - from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow - from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH + from gensim.models.word2vec_inner import train_sentence_sg, train_sentence_cbow, FAST_VERSION,\ + score_sentence_sg, score_sentence_cbow except ImportError: # failed... fall back to plain numpy (20-80x slower training than the above) FAST_VERSION = -1 - MAX_WORDS_IN_BATCH = 10000 - def train_batch_sg(model, sentences, alpha, work=None): + def train_sentence_sg(model, sentence, alpha, work=None): """ - Update skip-gram model by training on a sequence of sentences. + Update skip-gram model by training on a single sentence. - Each sentence is a list of string tokens, which are looked up in the model's + The sentence is a list of string tokens, which are looked up in the model's vocab dictionary. Called internally from `Word2Vec.train()`. This is the non-optimized, Python version. If you have cython installed, gensim will use the optimized version from word2vec_inner instead. """ - result = 0 - for sentence in sentences: - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and - model.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) - for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): - # don't train on the `word` itself - if pos2 != pos: - train_sg_pair(model, model.index2word[word.index], word2.index, alpha) - result += len(word_vocabs) - return result + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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) + for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): + # don't train on the `word` itself + if pos2 != pos: + train_sg_pair(model, model.index2word[word.index], word2.index, alpha) - def train_batch_cbow(model, sentences, alpha, work=None, neu1=None): + return len(word_vocabs) + + def train_sentence_cbow(model, sentence, alpha, work=None, neu1=None): """ - Update CBOW model by training on a sequence of sentences. + Update CBOW model by training on a single sentence. - Each sentence is a list of string tokens, which are looked up in the model's + The sentence is a list of string tokens, which are looked up in the model's vocab dictionary. Called internally from `Word2Vec.train()`. This is the non-optimized, Python version. If you have cython installed, gensim will use the optimized version from word2vec_inner instead. """ - result = 0 - for sentence in sentences: - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and - model.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 - 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)] - l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size - if word2_indices and model.cbow_mean: - l1 /= len(word2_indices) - train_cbow_pair(model, word, word2_indices, l1, alpha) - result += len(word_vocabs) - return result + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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 + 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)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + train_cbow_pair(model, word, word2_indices, l1, alpha) + + return len(word_vocabs) def score_sentence_sg(model, sentence, work=None): """ @@ -182,9 +176,9 @@ def score_sentence_sg(model, sentence, work=None): # now go over all words from the window, predicting each one in turn start = max(0, pos - model.window) - for pos2, word2 in enumerate(word_vocabs[start : pos + model.window + 1], start): + for pos2, word2 in enumerate(sentence[start:(pos + model.window + 1)], start): # don't train on OOV words and on the `word` itself - if word2 is not None and pos2 != pos: + if word2 and not (pos2 == pos): log_prob_sentence += score_sg_pair(model, word, word2) return log_prob_sentence @@ -210,7 +204,7 @@ def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): continue # OOV word in the input sentence => skip start = max(0, pos - model.window) - window_pos = enumerate(word_vocabs[start:(pos + model.window + 1)], start) + window_pos = enumerate(sentence[start:(pos + model.window + 1)], start) word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x layer1_size if word2_indices and model.cbow_mean: @@ -342,8 +336,8 @@ class Word2Vec(utils.SaveLoad): """ def __init__( self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, - max_vocab_size=None, sample=0, seed=1, workers=1, min_alpha=0.0001, - sg=1, hs=1, negative=0, cbow_mean=0, hashfxn=hash, iter=1, null_word=0, + max_vocab_size=None, sample=1e-3, seed=1, workers=12, min_alpha=0.0001, + sg=0, hs=1, negative=0, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, trim_rule=None, sorted_vocab=1): """ Initialize the model from an iterable of `sentences`. Each sentence is a @@ -357,8 +351,8 @@ def __init__( If you don't supply `sentences`, the model is left uninitialized -- use if you plan to initialize it in some other way. - `sg` defines the training algorithm. By default (`sg=1`), skip-gram is used. - Otherwise, `cbow` is employed. + `sg` defines the training algorithm. By default (`sg=0`), CBOW is used. + Otherwise (`sg=1`), SkipGram is employed. `size` is the dimensionality of the feature vectors. @@ -376,16 +370,17 @@ def __init__( need about 1GB of RAM. Set to `None` for no limit (default). `sample` = threshold for configuring which higher-frequency words are randomly downsampled; - default is 0 (off), useful value is 1e-5. + default is 1e-3, useful value is 1e-5, 0 stands for off. `workers` = use this many worker threads to train the model (=faster training with multicore machines). - `hs` = if 1 (default), hierarchical sampling will be used for model training (else set to 0). + `hs` = if 1 (default), hierarchical sampling will be used for model training (if set to 0, negative sampling will be used). `negative` = if > 0, negative sampling will be used, the int for negative specifies how many "noise words" should be drawn (usually between 5-20). + Default is 0, thus hierarchical softmax is used. - `cbow_mean` = if 0 (default), use the sum of the context word vectors. If 1, use the mean. + `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used. `hashfxn` = hash function to use to randomly initialize weights, for increased @@ -419,8 +414,8 @@ def __init__( self.random = random.RandomState(seed) self.min_count = min_count self.sample = sample - self.workers = int(workers) - self.min_alpha = float(min_alpha) + self.workers = workers + self.min_alpha = min_alpha self.hs = hs self.negative = negative self.cbow_mean = int(cbow_mean) @@ -651,25 +646,22 @@ def reset_from(self, other_model): self.corpus_count = other_model.corpus_count self.reset_weights() - 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)`. - """ + def _do_train_job(self, job, alpha, inits): work, neu1 = inits tally = 0 - if self.sg: - tally += train_batch_sg(self, sentences, alpha, work) - else: - tally += train_batch_cbow(self, sentences, alpha, work, neu1) - return tally, self._raw_word_count(sentences) + raw_tally = 0 + for sentence in job: + if self.sg: + tally += train_sentence_sg(self, sentence, alpha, work) + else: + tally += train_sentence_cbow(self, sentence, alpha, work, neu1) + raw_tally += len(sentence) + return (tally, raw_tally) - def _raw_word_count(self, job): - """Return the number of words in a given job.""" - return sum(len(sentence) for sentence in job) + def _raw_word_count(self, items): + return sum(len(item) for item in items) - def train(self, sentences, total_words=None, word_count=0, batch_words=None, - total_examples=None, queue_factor=2, report_delay=1.0): + def train(self, sentences, total_words=None, word_count=0, chunksize=100, total_examples=None, queue_factor=2, report_delay=1): """ Update the model's neural weights from a sequence of sentences (can be a once-only generator stream). For Word2Vec, each sentence must be a list of unicode strings. (Subclasses may accept other examples.) @@ -689,10 +681,9 @@ def train(self, sentences, total_words=None, word_count=0, batch_words=None, self.neg_labels = zeros(self.negative + 1) self.neg_labels[0] = 1. - batch_words = min(batch_words or MAX_WORDS_IN_BATCH, MAX_WORDS_IN_BATCH) logger.info( "training model with %i workers on %i vocabulary and %i features, " - "using sg=%s hs=%s sample=%s negative=%s", + "using sg=%s hs=%s sample=%s and negative=%s", self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) @@ -704,146 +695,122 @@ def train(self, sentences, total_words=None, word_count=0, batch_words=None, if total_words is None and total_examples is None: if self.corpus_count: total_examples = self.corpus_count - logger.info("expecting %i sentences, matching count from corpus used for vocabulary survey", total_examples) + logger.info("expecting %i examples, matching count from corpus used for vocabulary survey", total_examples) else: raise ValueError("you must provide either total_words or total_examples, to enable alpha and progress calculations") - self.jobs_finished, self.job_no, self.jobs_left = False, 0, 0 - if self.iter > 1: sentences = utils.RepeatCorpusNTimes(sentences, self.iter) total_words = total_words and total_words * self.iter total_examples = total_examples and total_examples * self.iter - def worker_loop(): - """Train the model, lifting lists of sentences from the job_queue.""" + def worker_init(): work = matutils.zeros_aligned(self.layer1_size, dtype=REAL) # per-thread private work memory neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) - jobs_processed = 0 + return (work, neu1) + + def worker_one_job(job, inits): + items, alpha = job + if items is None: # signal to finish + return False + # train & return tally + tally, raw_tally = self._do_train_job(items, alpha, inits) + progress_queue.put((len(items), tally, raw_tally)) # report progress + return True + + def worker_loop(): + """Train the model, lifting lists of sentences from the jobs queue.""" + init = worker_init() while True: job = job_queue.get() - if job is None: - progress_queue.put(None) - break # no more jobs => quit this worker - sentences, alpha = job - tally, raw_tally = self._do_train_job(sentences, alpha, (work, neu1)) - self.jobs_left -= 1 - progress_queue.put((len(sentences), tally, raw_tally)) # report back progress - jobs_processed += 1 - logger.debug("worker exiting, processed %i jobs", jobs_processed) - - def job_producer(): - """Fill jobs queue using the input `sentences` iterator.""" - job_batch, batch_size = [], 0 - pushed_words, pushed_examples = 0, 0 - next_alpha = self.alpha - - for sent_idx, sentence in enumerate(sentences): - sentence_length = self._raw_word_count([sentence]) - - # can we fit this sentence into the existing job batch? - if batch_size + sentence_length <= batch_words: - # yes => add it to the current job - job_batch.append(sentence) - batch_size += sentence_length - else: - # no => submit the existing job - logger.debug( - "queueing job #%i (%i words, %i sentences) at alpha %.05f", - self.job_no, batch_size, len(job_batch), next_alpha) - self.job_no += 1 - self.jobs_left += 1 - job_queue.put((job_batch, next_alpha)) - - # update the learning rate for the next job - if self.min_alpha < next_alpha: - if total_examples: - # examples-based decay - pushed_examples += len(job_batch) - progress = 1.0 * pushed_examples / total_examples - else: - # words-based decay - pushed_words += self._raw_word_count(job_batch) - progress = 1.0 * pushed_words / total_words - next_alpha = self.alpha - (self.alpha - self.min_alpha) * progress - next_alpha = max(self.min_alpha, next_alpha) - - # add the sentence that didn't fit as the first item of a new job - job_batch, batch_size = [sentence], sentence_length - - # add the last job too (may be significantly smaller than batch_words) - if job_batch: - logger.debug( - "queueing job #%i (%i words, %i sentences) at alpha %.05f", - self.job_no, batch_size, len(job_batch), next_alpha) - self.job_no += 1 - self.jobs_left += 1 - job_queue.put((job_batch, next_alpha)) - - self.jobs_finished = True - logger.info("reached end of input; waiting to finish %i outstanding jobs", self.jobs_left) - - if self.job_no == 0 and self.train_count == 0: - logger.warning( - "train() called with an empty iterator (if not intended, " - "be sure to provide a corpus that offers restartable " - "iteration = an iterable)." - ) - - # give the workers heads up that they can finish -- no more work! - for _ in xrange(self.workers): - job_queue.put(None) # no need to increase job_no - logger.debug("job loop exiting, total %i jobs", self.job_no) + if not worker_one_job(job, init): + break + + start, next_report = default_timer(), 1.0 # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( - job_queue = Queue(maxsize=queue_factor * self.workers) + if self.workers > 0: + job_queue = Queue(maxsize=queue_factor * self.workers) + else: + job_queue = FakeJobQueue(worker_init, worker_one_job) progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] - workers.append(threading.Thread(target=job_producer)) - for thread in workers: thread.daemon = True # make interrupting the process with ctrl+c easier thread.start() - example_count, trained_word_count, raw_word_count = 0, 0, word_count - start, next_report = default_timer(), 1.0 - - while not self.jobs_finished or self.jobs_left > 0: - report = progress_queue.get() # blocks if workers too slow - if report is None: - continue - examples, trained_words, raw_words = report - - # update progress stats - example_count += examples - trained_word_count += trained_words # only words in vocab & sampled - raw_word_count += raw_words - - # log progress once every report_delay seconds - elapsed = default_timer() - start - if elapsed >= next_report: - if total_examples: - # examples-based progress % - logger.info( - "PROGRESS: at %.2f%% examples, %.0f words/s, in_qsize %i, out_qsize %i", - 100.0 * example_count / total_examples, trained_word_count / elapsed, - utils.qsize(job_queue), utils.qsize(progress_queue)) + pushed_words = 0 + pushed_examples = 0 + example_count = 0 + trained_word_count = 0 + raw_word_count = word_count + push_done = False + done_jobs = 0 + next_alpha = self.alpha + jobs_source = enumerate(utils.grouper(sentences, chunksize)) + job_no = -1 + # fill jobs queue with (sentence, alpha) job tuples + while True: + try: + job_no, items = next(jobs_source) + logger.debug("putting job #%i in the queue at alpha %.05f", job_no, next_alpha) + job_queue.put((items, next_alpha)) + # update the learning rate before every next job + if self.min_alpha < next_alpha: + if total_examples: + # examples-based decay + pushed_examples += len(items) + next_alpha = self.alpha - (self.alpha - self.min_alpha) * (pushed_examples / total_examples) + else: + # words-based decay + pushed_words += self._raw_word_count(items) + next_alpha = self.alpha - (self.alpha - self.min_alpha) * (pushed_words / total_words) + next_alpha = max(next_alpha, self.min_alpha) + except StopIteration: + if job_no == -1 and self.train_count == 0: + logger.warning( + "train() called with empty iterator (if not intended, " + "be sure to provide a corpus that offers restartable " + "iteration)." + ) + logger.info( + "reached end of input; waiting to finish %i outstanding jobs", + job_no - done_jobs + 1) + for _ in xrange(self.workers): + job_queue.put((None, 0)) # give the workers heads up that they can finish -- no more work! + push_done = True + try: + while done_jobs < (job_no+1) or not push_done: + examples, trained_words, raw_words = progress_queue.get(push_done) # only block after all jobs pushed + example_count += examples + trained_word_count += trained_words # only words in vocab & sampled + raw_word_count += raw_words + done_jobs += 1 + elapsed = default_timer() - start + if elapsed >= next_report: + if total_examples: + # examples-based progress % + logger.info( + "PROGRESS: at %.2f%% examples, %.0f words/s", + 100.0 * example_count / total_examples, trained_word_count / elapsed) + else: + # words-based progress % + logger.info( + "PROGRESS: at %.2f%% words, %.0f words/s", + 100.0 * raw_word_count / total_words, trained_word_count / elapsed) + next_report = elapsed + report_delay # don't flood log, wait report_delay seconds else: - # words-based progress % - logger.info( - "PROGRESS: at %.2f%% words, %.0f words/s, in_qsize %i, out_qsize %i", - 100.0 * raw_word_count / total_words, trained_word_count / elapsed, - utils.qsize(job_queue), utils.qsize(progress_queue)) - next_report = elapsed + report_delay - - # all done; report the final stats + # loop ended by job count; really done + break + except Empty: + pass # already out of loop; continue to next push + elapsed = default_timer() - start logger.info( - "training on %i raw words (%i effective words) took %.1fs, %.0f effective words/s", - raw_word_count, trained_word_count, elapsed, trained_word_count / elapsed if elapsed else 0.0) + "training on %i raw words took %.1fs, %.0f trained words/s", + raw_word_count, elapsed, trained_word_count / elapsed if elapsed else 0.0) - # check that the input corpus hasn't changed during iteration if total_examples and total_examples != example_count: logger.warn("supplied example count (%i) did not equal expected count (%i)", example_count, total_examples) if total_words and total_words != raw_word_count: @@ -854,6 +821,13 @@ def job_producer(): self.clear_sims() return trained_word_count + def _score_job_words(self, sentence, inits): + work, neu1 = inits + if self.sg: + return score_sentence_sg(self, sentence, work) + else: + return score_sentence_cbow(self, sentence, work, neu1) + # basics copied from the train() function def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor=2, report_delay=1): """ @@ -886,29 +860,38 @@ def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor if not self.hs: raise RuntimeError("we have only implemented score for hs") - def worker_loop(): - """Train the model, lifting lists of sentences from the jobs queue.""" + def worker_init(): work = zeros(1, dtype=REAL) # for sg hs, we actually only need one memory loc (running sum) neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) + return (work, neu1) + + def worker_one_job(job, inits): + if job is None: # signal to finish + return False + ns = 0 + for (id, sentence) in job: + if id < total_sentences: + sentence_scores[id] = self._score_job_words(sentence, inits) + ns += 1 + else: + break + progress_queue.put(ns) # report progress + return True + + def worker_loop(): + """Train the model, lifting lists of sentences from the jobs queue.""" + init = worker_init() while True: job = job_queue.get() - if job is None: # signal to finish + if not worker_one_job(job, init): break - ns = 0 - for sentence_id, sentence in job: - if sentence_id >= total_sentences: - break - if self.sg: - score = score_sentence_sg(self, sentence, work) - else: - score = score_sentence_cbow(self, sentence, work, neu1) - sentence_scores[sentence_id] = score - ns += 1 - progress_queue.put(ns) # report progress start, next_report = default_timer(), 1.0 # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( - job_queue = Queue(maxsize=queue_factor * self.workers) + if self.workers > 0: + job_queue = Queue(maxsize=queue_factor * self.workers) + else: + job_queue = FakeJobQueue(worker_init, worker_one_job) progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] @@ -927,10 +910,8 @@ def worker_loop(): while True: try: job_no, items = next(jobs_source) - if (job_no - 1) * chunksize > total_sentences: - logger.warning( - "terminating after %i sentences (set higher total_sentences if you want more).", - total_sentences) + if (job_no-1)*chunksize > total_sentences: + logger.warning("terminating after %i sentences (set higher total_sentences if you want more)."%total_sentences) job_no -= 1 raise StopIteration() logger.debug("putting job #%i in the queue", job_no) @@ -943,15 +924,15 @@ def worker_loop(): job_queue.put(None) # give the workers heads up that they can finish -- no more work! push_done = True try: - while done_jobs < (job_no + 1) or not push_done: + while done_jobs < (job_no+1) or not push_done: ns = progress_queue.get(push_done) # only block after all jobs pushed sentence_count += ns done_jobs += 1 elapsed = default_timer() - start if elapsed >= next_report: logger.info( - "PROGRESS: at %.2f%% sentences, %.0f sentences/s", - 100.0 * sentence_count, sentence_count / elapsed) + "PROGRESS: at %.2f%% sentences, %.0f sentences/s", + 100.0 * sentence_count, sentence_count / elapsed) next_report = elapsed + report_delay # don't flood log, wait report_delay seconds else: # loop ended by job count; really done @@ -961,9 +942,8 @@ def worker_loop(): elapsed = default_timer() - start self.clear_sims() - logger.info( - "scoring %i sentences took %.1fs, %.0f sentences/s", - sentence_count, elapsed, sentence_count / elapsed if elapsed else 0.0) + logger.info("scoring %i sentences took %.1fs, %.0f sentences/s" + % (sentence_count, elapsed, sentence_count / elapsed if elapsed else 0.0)) return sentence_scores[:sentence_count] def clear_sims(self): @@ -1015,7 +995,7 @@ def save_word2vec_format(self, fname, fvocab=None, binary=False): fout.write(utils.to_utf8("%s %s\n" % (word, ' '.join("%f" % val for val in row)))) @classmethod - def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', unicode_errors='strict'): + def load_word2vec_format(cls, fname, fvocab=None, binary=False, norm_only=True, encoding='utf8', unicode_errors='strict'): """ Load the input-hidden weight matrix from the original C word2vec-tool format. @@ -1096,6 +1076,7 @@ def add_word(word, weights): assert (len(result.vocab), result.vector_size) == result.syn0.shape logger.info("loaded %s matrix from %s" % (result.syn0.shape, fname)) + result.init_sims(norm_only) return result def intersect_word2vec_format(self, fname, binary=False, encoding='utf8', unicode_errors='strict'): @@ -1486,7 +1467,7 @@ def load(cls, *args, **kwargs): for v in model.vocab.values(): if hasattr(v, 'sample_int'): break # already 0.12.0+ style int probabilities - elif hasattr(v, 'sample_probability'): + else: v.sample_int = int(round(v.sample_probability * 2**32)) del v.sample_probability if not hasattr(model, 'syn0_lockf') and hasattr(model, 'syn0'): @@ -1499,6 +1480,16 @@ def load(cls, *args, **kwargs): return model +class FakeJobQueue(object): + """Pretends to be a Queue; does equivalent of work_loop in calling thread.""" + def __init__(self, init_fn, job_fn): + self.inits = init_fn() + self.job_fn = job_fn + + def put(self, job): + self.job_fn(job, self.inits) + + class BrownCorpus(object): """Iterate over sentences from the Brown corpus (part of NLTK data).""" def __init__(self, dirname): @@ -1523,7 +1514,7 @@ def __iter__(self): class Text8Corpus(object): """Iterate over sentences from the "text8" corpus, unzipped from http://mattmahoney.net/dc/text8.zip .""" - def __init__(self, fname, max_sentence_length=MAX_WORDS_IN_BATCH): + def __init__(self, fname, max_sentence_length=1000): self.fname = fname self.max_sentence_length = max_sentence_length @@ -1553,7 +1544,7 @@ class LineSentence(object): Simple format: one sentence = one line; words already preprocessed and separated by whitespace. """ - def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None): + def __init__(self, source, max_sentence_length=10000, limit=None): """ `source` can be either a string or a file object. Clip the file to the first `limit` lines (or no clipped if limit is None, the default). @@ -1596,34 +1587,65 @@ def __iter__(self): # Example: ./word2vec.py ~/workspace/word2vec/text8 ~/workspace/word2vec/questions-words.txt ./text8 +# Example: ./word2vec.py -train data.txt -output vec.txt -size 200 -window 5 -sample 1e-4 -negative 5 -hs 0 -binary 0 -cbow 1 -iter 3 if __name__ == "__main__": + import argparse logging.basicConfig( format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', level=logging.INFO) - logger.info("running %s", " ".join(sys.argv)) - logger.info("using optimization %s", FAST_VERSION) + logging.info("running %s", " ".join(sys.argv)) + logging.info("using optimization %s", FAST_VERSION) + # check and process cmdline input program = os.path.basename(sys.argv[0]) if len(sys.argv) < 2: print(globals()['__doc__'] % locals()) sys.exit(1) - infile = sys.argv[1] + from gensim.models.word2vec import Word2Vec # avoid referencing __main__ in pickle seterr(all='raise') # don't ignore numpy errors - - # model = Word2Vec(LineSentence(infile), size=200, min_count=5, workers=4) - model = Word2Vec(Text8Corpus(infile, 10), size=256, min_count=5, workers=4, sg=0, hs=0, cbow_mean=1, negative=5) - - if len(sys.argv) > 3: - outfile = sys.argv[3] - model.save(outfile + '.model') - model.save_word2vec_format(outfile + '.model.bin', binary=True) - model.save_word2vec_format(outfile + '.model.txt', binary=False) - - if len(sys.argv) > 2: - questions_file = sys.argv[2] - model.accuracy(sys.argv[2]) - - logger.info("finished running %s", program) + + parser = argparse.ArgumentParser() + parser.add_argument("-train", help="Use text data from file TRAIN to train the model", required=True) + parser.add_argument("-output", help="Use file OUTPUT to save the resulting word vectors") + parser.add_argument("-window", help="Set max skip length WINDOW between words; default is 5", type=int, default=5) + parser.add_argument("-size", help="Set size of word vectors; default is 100", type=int, default=100) + parser.add_argument("-sample", help="Set threshold for occurrence of words. Those that appear with higher frequency in the training data will be randomly down-sampled; default is 1e-3, useful range is (0, 1e-5)", type=float, default=1e-3) + parser.add_argument("-hs", help="Use Hierarchical Softmax; default is 0 (not used)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-negative", help="Number of negative examples; default is 5, common values are 3 - 10 (0 = not used)", type=int, default=5) + parser.add_argument("-threads", help="Use THREADS threads (default 12)", type=int, default=12) + parser.add_argument("-iter", help="Run more training iterations (default 5)", type=int, default=5) + parser.add_argument("-min_count", help="This will discard words that appear less than MIN_COUNT times; default is 5", type=int, default=5) + parser.add_argument("-cbow", help="Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)", type=int, default=1, choices=[0, 1]) + parser.add_argument("-binary", help="Save the resulting vectors in binary mode; default is 0 (off)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-accuracy", help="Use questions from file ACCURACY to evaluate the model") + + args = parser.parse_args() + + if args.cbow == 0: + skipgram = 1 + else: + skipgram = 0 + + corpus = LineSentence(args.train) + + model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window,sample=args.sample,sg=skipgram,hs=args.hs,negative=args.negative,cbow_mean=1,iter=args.iter) + + if args.output: + outfile = args.output + model.save_word2vec_format(outfile, binary=args.binary) + else: + outfile = args.train + model.save(outfile + '.model') + if args.binary == 1: + model.save_word2vec_format(outfile + '.model.bin', binary=True) + else: + model.save_word2vec_format(outfile + '.model.txt', binary=False) + + if args.accuracy: + questions_file = args.accuracy + model.accuracy(questions_file) + + logging.info("finished running %s", program) diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index b377071b17..612d43aca4 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -21,7 +21,7 @@ from gensim import utils, matutils from gensim.models import word2vec -module_path = os.path.dirname(__file__) # needed because sample data files are located in the same folder +module_path = os.path.dirname(__file__) # needed because sample data files are located in the same folder datapath = lambda fname: os.path.join(module_path, 'test_data', fname) @@ -50,14 +50,12 @@ def testfile(): # temporary data will be stored to this file return os.path.join(tempfile.gettempdir(), 'gensim_word2vec.tst') - def _rule(word, count, min_count): if word == "human": return utils.RULE_DISCARD # throw out else: return utils.RULE_DEFAULT # apply default rule, i.e. min_count - class TestWord2VecModel(unittest.TestCase): def testPersistence(self): """Test storing/loading the entire model.""" @@ -95,11 +93,9 @@ def testPersistenceWord2VecFormat(self): model = word2vec.Word2Vec(sentences, min_count=1) model.init_sims() model.save_word2vec_format(testfile(), binary=True) - binary_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True) - binary_model.init_sims(replace=False) + binary_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True, norm_only=False) self.assertTrue(numpy.allclose(model['human'], binary_model['human'])) - norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True) - norm_only_model.init_sims(replace=True) + norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True, norm_only=True) self.assertFalse(numpy.allclose(model['human'], norm_only_model['human'])) self.assertTrue(numpy.allclose(model.syn0norm[model.vocab['human'].index], norm_only_model['human'])) @@ -108,11 +104,9 @@ def testPersistenceWord2VecFormatNonBinary(self): model = word2vec.Word2Vec(sentences, min_count=1) model.init_sims() model.save_word2vec_format(testfile(), binary=False) - text_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False) - text_model.init_sims(False) + text_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False, norm_only=False) self.assertTrue(numpy.allclose(model['human'], text_model['human'], atol=1e-6)) - norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False) - norm_only_model.init_sims(True) + norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False, norm_only=True) self.assertFalse(numpy.allclose(model['human'], norm_only_model['human'], atol=1e-6)) self.assertTrue(numpy.allclose(model.syn0norm[model.vocab['human'].index], norm_only_model['human'], atol=1e-4)) @@ -126,17 +120,10 @@ def testPersistenceWord2VecFormatWithVocab(self): binary_model_with_vocab = word2vec.Word2Vec.load_word2vec_format(testfile(), testvocab, binary=True) self.assertEqual(model.vocab['human'].count, binary_model_with_vocab.vocab['human'].count) - def testPersistenceWord2VecFormatCombinationWithStandardPersistence(self): - """Test storing/loading the entire model and vocabulary in word2vec format chained with - saving and loading via `save` and `load` methods`.""" + def test_zero_workers_mode(self): model = word2vec.Word2Vec(sentences, min_count=1) - model.init_sims() - testvocab = os.path.join(tempfile.gettempdir(), 'gensim_word2vec.vocab') - model.save_word2vec_format(testfile(), testvocab, binary=True) - binary_model_with_vocab = word2vec.Word2Vec.load_word2vec_format(testfile(), testvocab, binary=True) - binary_model_with_vocab.save(testfile()) - binary_model_with_vocab = word2vec.Word2Vec.load(testfile()) - self.assertEqual(model.vocab['human'].count, binary_model_with_vocab.vocab['human'].count) + model0 = word2vec.Word2Vec(sentences, min_count=1, workers=0) + self.models_equal(model,model0) def testLargeMmap(self): """Test storing/loading the entire model.""" @@ -204,7 +191,8 @@ def testScoring(self): # just score and make sure they exist scores = model.score(sentences, len(sentences)) - self.assertEqual(len(scores), len(sentences)) + self.assertEqual(len(scores),len(sentences)) + def testLocking(self): """Test word2vec training doesn't change locked vectors.""" @@ -221,8 +209,8 @@ def testLocking(self): model.syn0_lockf[0] = 0.0 model.train(corpus) - self.assertFalse((unlocked1 == model.syn0[1]).all()) # unlocked vector should vary - self.assertTrue((locked0 == model.syn0[0]).all()) # locked vector should not vary + self.assertFalse((unlocked1==model.syn0[1]).all()) # unlocked vector should vary + self.assertTrue((locked0==model.syn0[0]).all()) # locked vector should not vary def model_sanity(self, model, train=True): """Even tiny models trained on LeeCorpus should pass these sanity checks""" @@ -231,11 +219,11 @@ def model_sanity(self, model, train=True): model.build_vocab(list_corpus) orig0 = numpy.copy(model.syn0[0]) model.train(list_corpus) - self.assertFalse((orig0 == model.syn0[1]).all()) # vector should vary after training + self.assertFalse((orig0==model.syn0[1]).all()) # vector should vary after training sims = model.most_similar('war', topn=len(model.index2word)) t_rank = [word for word, score in sims].index('terrorism') # in >200 calibration runs w/ calling parameters, 'terrorism' in 50-most_sim for 'war' - self.assertLess(t_rank, 50) + self.assertLess(t_rank, 70) war_vec = model['war'] sims2 = model.most_similar([war_vec], topn=51) self.assertTrue('war' in [word for word, score in sims2]) @@ -406,7 +394,6 @@ def testLineSentenceWorksWithNormalFile(self): self.assertEqual(words, utils.to_unicode(orig.readline()).split()) #endclass TestWord2VecSentenceIterators - if not hasattr(TestWord2VecModel, 'assertLess'): # workaround for python 2.6 def assertLess(self, a, b, msg=None): @@ -414,10 +401,7 @@ def assertLess(self, a, b, msg=None): setattr(TestWord2VecModel, 'assertLess', assertLess) - if __name__ == '__main__': - logging.basicConfig( - format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', - level=logging.DEBUG) - logging.info("using optimization %s", word2vec.FAST_VERSION) + logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG) + logging.info("using optimization %s" % word2vec.FAST_VERSION) unittest.main() From e689b4f70e7aa93f8ad776053a213dcf49937854 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Thu, 14 Jan 2016 20:49:22 +0100 Subject: [PATCH 09/33] Fix for #538 --- gensim/models/word2vec.py | 408 +++++++++++++++++++------------------- 1 file changed, 208 insertions(+), 200 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 559dceab3c..aa410f004a 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -59,7 +59,7 @@ where "words" are actually multiword expressions, such as `new_york_times` or `financial_crisis`: >>> bigram_transformer = gensim.models.Phrases(sentences) ->>> model = Word2Vec(bigram_transformed[sentences], size=100, ...) +>>> model = Word2Vec(bigram_transformer[sentences], size=100, ...) .. [1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013. .. [2] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their Compositionality. @@ -94,64 +94,70 @@ from six.moves import xrange from types import GeneratorType -logger = logging.getLogger("gensim.models.word2vec") +logger = logging.getLogger(__name__) try: - from gensim.models.word2vec_inner import train_sentence_sg, train_sentence_cbow, FAST_VERSION,\ - score_sentence_sg, score_sentence_cbow + from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow + from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow + from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH except ImportError: # failed... fall back to plain numpy (20-80x slower training than the above) FAST_VERSION = -1 + MAX_WORDS_IN_BATCH = 10000 - def train_sentence_sg(model, sentence, alpha, work=None): + def train_batch_sg(model, sentences, alpha, work=None): """ - Update skip-gram model by training on a single sentence. + Update skip-gram model by training on a sequence of sentences. - The sentence is a list of string tokens, which are looked up in the model's + Each sentence is a list of string tokens, which are looked up in the model's vocab dictionary. Called internally from `Word2Vec.train()`. This is the non-optimized, Python version. If you have cython installed, gensim will use the optimized version from word2vec_inner instead. """ - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and - model.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) - for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): - # don't train on the `word` itself - if pos2 != pos: - train_sg_pair(model, model.index2word[word.index], word2.index, alpha) - - return len(word_vocabs) + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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) + for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): + # don't train on the `word` itself + if pos2 != pos: + train_sg_pair(model, model.index2word[word.index], word2.index, alpha) + result += len(word_vocabs) + return result - def train_sentence_cbow(model, sentence, alpha, work=None, neu1=None): + def train_batch_cbow(model, sentences, alpha, work=None, neu1=None): """ - Update CBOW model by training on a single sentence. + Update CBOW model by training on a sequence of sentences. - The sentence is a list of string tokens, which are looked up in the model's + Each sentence is a list of string tokens, which are looked up in the model's vocab dictionary. Called internally from `Word2Vec.train()`. This is the non-optimized, Python version. If you have cython installed, gensim will use the optimized version from word2vec_inner instead. """ - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and - model.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 - 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)] - l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size - if word2_indices and model.cbow_mean: - l1 /= len(word2_indices) - train_cbow_pair(model, word, word2_indices, l1, alpha) - - return len(word_vocabs) + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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 + 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)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + train_cbow_pair(model, word, word2_indices, l1, alpha) + result += len(word_vocabs) + return result def score_sentence_sg(model, sentence, work=None): """ @@ -176,9 +182,9 @@ def score_sentence_sg(model, sentence, work=None): # now go over all words from the window, predicting each one in turn start = max(0, pos - model.window) - for pos2, word2 in enumerate(sentence[start:(pos + model.window + 1)], start): + for pos2, word2 in enumerate(word_vocabs[start : pos + model.window + 1], start): # don't train on OOV words and on the `word` itself - if word2 and not (pos2 == pos): + if word2 is not None and pos2 != pos: log_prob_sentence += score_sg_pair(model, word, word2) return log_prob_sentence @@ -204,7 +210,7 @@ def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): continue # OOV word in the input sentence => skip start = max(0, pos - model.window) - window_pos = enumerate(sentence[start:(pos + model.window + 1)], start) + window_pos = enumerate(word_vocabs[start:(pos + model.window + 1)], start) word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x layer1_size if word2_indices and model.cbow_mean: @@ -397,7 +403,6 @@ def __init__( `sorted_vocab` = if 1 (default), sort the vocabulary by descending frequency before assigning word indexes. - """ self.vocab = {} # mapping from a word (string) to a Vocab object self.index2word = [] # map from a word's matrix index (int) to word (string) @@ -414,8 +419,8 @@ def __init__( self.random = random.RandomState(seed) self.min_count = min_count self.sample = sample - self.workers = workers - self.min_alpha = min_alpha + self.workers = int(workers) + self.min_alpha = float(min_alpha) self.hs = hs self.negative = negative self.cbow_mean = int(cbow_mean) @@ -646,22 +651,25 @@ def reset_from(self, other_model): self.corpus_count = other_model.corpus_count self.reset_weights() - def _do_train_job(self, job, alpha, inits): + 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)`. + """ work, neu1 = inits tally = 0 - raw_tally = 0 - for sentence in job: - if self.sg: - tally += train_sentence_sg(self, sentence, alpha, work) - else: - tally += train_sentence_cbow(self, sentence, alpha, work, neu1) - raw_tally += len(sentence) - return (tally, raw_tally) + if self.sg: + tally += train_batch_sg(self, sentences, alpha, work) + else: + tally += train_batch_cbow(self, sentences, alpha, work, neu1) + return tally, self._raw_word_count(sentences) - def _raw_word_count(self, items): - return sum(len(item) for item in items) + def _raw_word_count(self, job): + """Return the number of words in a given job.""" + return sum(len(sentence) for sentence in job) - def train(self, sentences, total_words=None, word_count=0, chunksize=100, total_examples=None, queue_factor=2, report_delay=1): + def train(self, sentences, total_words=None, word_count=0, batch_words=None, + total_examples=None, 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 Word2Vec, each sentence must be a list of unicode strings. (Subclasses may accept other examples.) @@ -681,9 +689,10 @@ def train(self, sentences, total_words=None, word_count=0, chunksize=100, total_ self.neg_labels = zeros(self.negative + 1) self.neg_labels[0] = 1. + batch_words = min(batch_words or MAX_WORDS_IN_BATCH, MAX_WORDS_IN_BATCH) logger.info( "training model with %i workers on %i vocabulary and %i features, " - "using sg=%s hs=%s sample=%s and negative=%s", + "using sg=%s hs=%s sample=%s negative=%s", self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) @@ -695,122 +704,146 @@ def train(self, sentences, total_words=None, word_count=0, chunksize=100, total_ if total_words is None and total_examples is None: if self.corpus_count: total_examples = self.corpus_count - logger.info("expecting %i examples, matching count from corpus used for vocabulary survey", total_examples) + logger.info("expecting %i sentences, matching count from corpus used for vocabulary survey", total_examples) else: raise ValueError("you must provide either total_words or total_examples, to enable alpha and progress calculations") + self.jobs_finished, self.job_no, self.jobs_left = False, 0, 0 + if self.iter > 1: sentences = utils.RepeatCorpusNTimes(sentences, self.iter) total_words = total_words and total_words * self.iter total_examples = total_examples and total_examples * self.iter - def worker_init(): + def worker_loop(): + """Train the model, lifting lists of sentences from the job_queue.""" work = matutils.zeros_aligned(self.layer1_size, dtype=REAL) # per-thread private work memory neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) - return (work, neu1) - - def worker_one_job(job, inits): - items, alpha = job - if items is None: # signal to finish - return False - # train & return tally - tally, raw_tally = self._do_train_job(items, alpha, inits) - progress_queue.put((len(items), tally, raw_tally)) # report progress - return True - - def worker_loop(): - """Train the model, lifting lists of sentences from the jobs queue.""" - init = worker_init() + jobs_processed = 0 while True: job = job_queue.get() - if not worker_one_job(job, init): - break - - start, next_report = default_timer(), 1.0 + if job is None: + progress_queue.put(None) + break # no more jobs => quit this worker + sentences, alpha = job + tally, raw_tally = self._do_train_job(sentences, alpha, (work, neu1)) + self.jobs_left -= 1 + progress_queue.put((len(sentences), tally, raw_tally)) # report back progress + jobs_processed += 1 + logger.debug("worker exiting, processed %i jobs", jobs_processed) + + def job_producer(): + """Fill jobs queue using the input `sentences` iterator.""" + job_batch, batch_size = [], 0 + pushed_words, pushed_examples = 0, 0 + next_alpha = self.alpha + + for sent_idx, sentence in enumerate(sentences): + sentence_length = self._raw_word_count([sentence]) + + # can we fit this sentence into the existing job batch? + if batch_size + sentence_length <= batch_words: + # yes => add it to the current job + job_batch.append(sentence) + batch_size += sentence_length + else: + # no => submit the existing job + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + self.job_no, batch_size, len(job_batch), next_alpha) + self.job_no += 1 + self.jobs_left += 1 + job_queue.put((job_batch, next_alpha)) + + # update the learning rate for the next job + if self.min_alpha < next_alpha: + if total_examples: + # examples-based decay + pushed_examples += len(job_batch) + progress = 1.0 * pushed_examples / total_examples + else: + # words-based decay + pushed_words += self._raw_word_count(job_batch) + progress = 1.0 * pushed_words / total_words + next_alpha = self.alpha - (self.alpha - self.min_alpha) * progress + next_alpha = max(self.min_alpha, next_alpha) + + # add the sentence that didn't fit as the first item of a new job + job_batch, batch_size = [sentence], sentence_length + + # add the last job too (may be significantly smaller than batch_words) + if job_batch: + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + self.job_no, batch_size, len(job_batch), next_alpha) + self.job_no += 1 + self.jobs_left += 1 + job_queue.put((job_batch, next_alpha)) + + self.jobs_finished = True + logger.info("reached end of input; waiting to finish %i outstanding jobs", self.jobs_left) + + if self.job_no == 0 and self.train_count == 0: + logger.warning( + "train() called with an empty iterator (if not intended, " + "be sure to provide a corpus that offers restartable " + "iteration = an iterable)." + ) + + # give the workers heads up that they can finish -- no more work! + for _ in xrange(self.workers): + job_queue.put(None) # no need to increase job_no + logger.debug("job loop exiting, total %i jobs", self.job_no) # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( - if self.workers > 0: - job_queue = Queue(maxsize=queue_factor * self.workers) - else: - job_queue = FakeJobQueue(worker_init, worker_one_job) + job_queue = Queue(maxsize=queue_factor * self.workers) progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + workers.append(threading.Thread(target=job_producer)) + for thread in workers: thread.daemon = True # make interrupting the process with ctrl+c easier thread.start() - pushed_words = 0 - pushed_examples = 0 - example_count = 0 - trained_word_count = 0 - raw_word_count = word_count - push_done = False - done_jobs = 0 - next_alpha = self.alpha - jobs_source = enumerate(utils.grouper(sentences, chunksize)) - job_no = -1 - # fill jobs queue with (sentence, alpha) job tuples - while True: - try: - job_no, items = next(jobs_source) - logger.debug("putting job #%i in the queue at alpha %.05f", job_no, next_alpha) - job_queue.put((items, next_alpha)) - # update the learning rate before every next job - if self.min_alpha < next_alpha: - if total_examples: - # examples-based decay - pushed_examples += len(items) - next_alpha = self.alpha - (self.alpha - self.min_alpha) * (pushed_examples / total_examples) - else: - # words-based decay - pushed_words += self._raw_word_count(items) - next_alpha = self.alpha - (self.alpha - self.min_alpha) * (pushed_words / total_words) - next_alpha = max(next_alpha, self.min_alpha) - except StopIteration: - if job_no == -1 and self.train_count == 0: - logger.warning( - "train() called with empty iterator (if not intended, " - "be sure to provide a corpus that offers restartable " - "iteration)." - ) - logger.info( - "reached end of input; waiting to finish %i outstanding jobs", - job_no - done_jobs + 1) - for _ in xrange(self.workers): - job_queue.put((None, 0)) # give the workers heads up that they can finish -- no more work! - push_done = True - try: - while done_jobs < (job_no+1) or not push_done: - examples, trained_words, raw_words = progress_queue.get(push_done) # only block after all jobs pushed - example_count += examples - trained_word_count += trained_words # only words in vocab & sampled - raw_word_count += raw_words - done_jobs += 1 - elapsed = default_timer() - start - if elapsed >= next_report: - if total_examples: - # examples-based progress % - logger.info( - "PROGRESS: at %.2f%% examples, %.0f words/s", - 100.0 * example_count / total_examples, trained_word_count / elapsed) - else: - # words-based progress % - logger.info( - "PROGRESS: at %.2f%% words, %.0f words/s", - 100.0 * raw_word_count / total_words, trained_word_count / elapsed) - next_report = elapsed + report_delay # don't flood log, wait report_delay seconds - else: - # loop ended by job count; really done - break - except Empty: - pass # already out of loop; continue to next push + example_count, trained_word_count, raw_word_count = 0, 0, word_count + start, next_report = default_timer(), 1.0 + while not self.jobs_finished or self.jobs_left > 0: + report = progress_queue.get() # blocks if workers too slow + if report is None: + continue + examples, trained_words, raw_words = report + + # update progress stats + example_count += examples + trained_word_count += trained_words # only words in vocab & sampled + raw_word_count += raw_words + + # log progress once every report_delay seconds + elapsed = default_timer() - start + if elapsed >= next_report: + if total_examples: + # examples-based progress % + logger.info( + "PROGRESS: at %.2f%% examples, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * example_count / total_examples, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + else: + # words-based progress % + logger.info( + "PROGRESS: at %.2f%% words, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * raw_word_count / total_words, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + next_report = elapsed + report_delay + + # all done; report the final stats elapsed = default_timer() - start logger.info( - "training on %i raw words took %.1fs, %.0f trained words/s", - raw_word_count, elapsed, trained_word_count / elapsed if elapsed else 0.0) + "training on %i raw words (%i effective words) took %.1fs, %.0f effective words/s", + raw_word_count, trained_word_count, elapsed, trained_word_count / elapsed if elapsed else 0.0) + # check that the input corpus hasn't changed during iteration if total_examples and total_examples != example_count: logger.warn("supplied example count (%i) did not equal expected count (%i)", example_count, total_examples) if total_words and total_words != raw_word_count: @@ -821,13 +854,6 @@ def worker_loop(): self.clear_sims() return trained_word_count - def _score_job_words(self, sentence, inits): - work, neu1 = inits - if self.sg: - return score_sentence_sg(self, sentence, work) - else: - return score_sentence_cbow(self, sentence, work, neu1) - # basics copied from the train() function def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor=2, report_delay=1): """ @@ -860,38 +886,29 @@ def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor if not self.hs: raise RuntimeError("we have only implemented score for hs") - def worker_init(): - work = zeros(1, dtype=REAL) # for sg hs, we actually only need one memory loc (running sum) - neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) - return (work, neu1) - - def worker_one_job(job, inits): - if job is None: # signal to finish - return False - ns = 0 - for (id, sentence) in job: - if id < total_sentences: - sentence_scores[id] = self._score_job_words(sentence, inits) - ns += 1 - else: - break - progress_queue.put(ns) # report progress - return True - def worker_loop(): """Train the model, lifting lists of sentences from the jobs queue.""" - init = worker_init() + work = zeros(1, dtype=REAL) # for sg hs, we actually only need one memory loc (running sum) + neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) while True: job = job_queue.get() - if not worker_one_job(job, init): + if job is None: # signal to finish break + ns = 0 + for sentence_id, sentence in job: + if sentence_id >= total_sentences: + break + if self.sg: + score = score_sentence_sg(self, sentence, work) + else: + score = score_sentence_cbow(self, sentence, work, neu1) + sentence_scores[sentence_id] = score + ns += 1 + progress_queue.put(ns) # report progress start, next_report = default_timer(), 1.0 # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( - if self.workers > 0: - job_queue = Queue(maxsize=queue_factor * self.workers) - else: - job_queue = FakeJobQueue(worker_init, worker_one_job) + job_queue = Queue(maxsize=queue_factor * self.workers) progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] @@ -910,8 +927,10 @@ def worker_loop(): while True: try: job_no, items = next(jobs_source) - if (job_no-1)*chunksize > total_sentences: - logger.warning("terminating after %i sentences (set higher total_sentences if you want more)."%total_sentences) + if (job_no - 1) * chunksize > total_sentences: + logger.warning( + "terminating after %i sentences (set higher total_sentences if you want more).", + total_sentences) job_no -= 1 raise StopIteration() logger.debug("putting job #%i in the queue", job_no) @@ -924,15 +943,15 @@ def worker_loop(): job_queue.put(None) # give the workers heads up that they can finish -- no more work! push_done = True try: - while done_jobs < (job_no+1) or not push_done: + while done_jobs < (job_no + 1) or not push_done: ns = progress_queue.get(push_done) # only block after all jobs pushed sentence_count += ns done_jobs += 1 elapsed = default_timer() - start if elapsed >= next_report: logger.info( - "PROGRESS: at %.2f%% sentences, %.0f sentences/s", - 100.0 * sentence_count, sentence_count / elapsed) + "PROGRESS: at %.2f%% sentences, %.0f sentences/s", + 100.0 * sentence_count, sentence_count / elapsed) next_report = elapsed + report_delay # don't flood log, wait report_delay seconds else: # loop ended by job count; really done @@ -942,8 +961,9 @@ def worker_loop(): elapsed = default_timer() - start self.clear_sims() - logger.info("scoring %i sentences took %.1fs, %.0f sentences/s" - % (sentence_count, elapsed, sentence_count / elapsed if elapsed else 0.0)) + logger.info( + "scoring %i sentences took %.1fs, %.0f sentences/s", + sentence_count, elapsed, sentence_count / elapsed if elapsed else 0.0) return sentence_scores[:sentence_count] def clear_sims(self): @@ -995,7 +1015,7 @@ def save_word2vec_format(self, fname, fvocab=None, binary=False): fout.write(utils.to_utf8("%s %s\n" % (word, ' '.join("%f" % val for val in row)))) @classmethod - def load_word2vec_format(cls, fname, fvocab=None, binary=False, norm_only=True, encoding='utf8', unicode_errors='strict'): + def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', unicode_errors='strict'): """ Load the input-hidden weight matrix from the original C word2vec-tool format. @@ -1076,7 +1096,6 @@ def add_word(word, weights): assert (len(result.vocab), result.vector_size) == result.syn0.shape logger.info("loaded %s matrix from %s" % (result.syn0.shape, fname)) - result.init_sims(norm_only) return result def intersect_word2vec_format(self, fname, binary=False, encoding='utf8', unicode_errors='strict'): @@ -1467,7 +1486,7 @@ def load(cls, *args, **kwargs): for v in model.vocab.values(): if hasattr(v, 'sample_int'): break # already 0.12.0+ style int probabilities - else: + elif hasattr(v, 'sample_probability'): v.sample_int = int(round(v.sample_probability * 2**32)) del v.sample_probability if not hasattr(model, 'syn0_lockf') and hasattr(model, 'syn0'): @@ -1480,16 +1499,6 @@ def load(cls, *args, **kwargs): return model -class FakeJobQueue(object): - """Pretends to be a Queue; does equivalent of work_loop in calling thread.""" - def __init__(self, init_fn, job_fn): - self.inits = init_fn() - self.job_fn = job_fn - - def put(self, job): - self.job_fn(job, self.inits) - - class BrownCorpus(object): """Iterate over sentences from the Brown corpus (part of NLTK data).""" def __init__(self, dirname): @@ -1514,7 +1523,7 @@ def __iter__(self): class Text8Corpus(object): """Iterate over sentences from the "text8" corpus, unzipped from http://mattmahoney.net/dc/text8.zip .""" - def __init__(self, fname, max_sentence_length=1000): + def __init__(self, fname, max_sentence_length=MAX_WORDS_IN_BATCH): self.fname = fname self.max_sentence_length = max_sentence_length @@ -1544,7 +1553,7 @@ class LineSentence(object): Simple format: one sentence = one line; words already preprocessed and separated by whitespace. """ - def __init__(self, source, max_sentence_length=10000, limit=None): + def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None): """ `source` can be either a string or a file object. Clip the file to the first `limit` lines (or no clipped if limit is None, the default). @@ -1586,7 +1595,6 @@ def __iter__(self): i += self.max_sentence_length -# Example: ./word2vec.py ~/workspace/word2vec/text8 ~/workspace/word2vec/questions-words.txt ./text8 # Example: ./word2vec.py -train data.txt -output vec.txt -size 200 -window 5 -sample 1e-4 -negative 5 -hs 0 -binary 0 -cbow 1 -iter 3 if __name__ == "__main__": import argparse From a5274ab541cb5173081e1feb7d05de3973c089d3 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Fri, 15 Jan 2016 00:20:26 +0100 Subject: [PATCH 10/33] Fix for #538 (tabs and spaces). --- gensim/models/word2vec.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index aa410f004a..0802399f79 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -1633,27 +1633,27 @@ def __iter__(self): args = parser.parse_args() if args.cbow == 0: - skipgram = 1 + skipgram = 1 else: - skipgram = 0 + skipgram = 0 corpus = LineSentence(args.train) model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window,sample=args.sample,sg=skipgram,hs=args.hs,negative=args.negative,cbow_mean=1,iter=args.iter) if args.output: - outfile = args.output - model.save_word2vec_format(outfile, binary=args.binary) + outfile = args.output + model.save_word2vec_format(outfile, binary=args.binary) else: - outfile = args.train - model.save(outfile + '.model') - if args.binary == 1: - model.save_word2vec_format(outfile + '.model.bin', binary=True) - else: - model.save_word2vec_format(outfile + '.model.txt', binary=False) + outfile = args.train + model.save(outfile + '.model') + if args.binary == 1: + model.save_word2vec_format(outfile + '.model.bin', binary=True) + else: + model.save_word2vec_format(outfile + '.model.txt', binary=False) if args.accuracy: - questions_file = args.accuracy + questions_file = args.accuracy model.accuracy(questions_file) logging.info("finished running %s", program) From 5c32ca817fefa45b1bf337a05191ccbdb6f08be9 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Fri, 15 Jan 2016 02:00:59 +0100 Subject: [PATCH 11/33] Fix for #538 (tests). --- gensim/test/test_word2vec.py | 48 ++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index 612d43aca4..b377071b17 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -21,7 +21,7 @@ from gensim import utils, matutils from gensim.models import word2vec -module_path = os.path.dirname(__file__) # needed because sample data files are located in the same folder +module_path = os.path.dirname(__file__) # needed because sample data files are located in the same folder datapath = lambda fname: os.path.join(module_path, 'test_data', fname) @@ -50,12 +50,14 @@ def testfile(): # temporary data will be stored to this file return os.path.join(tempfile.gettempdir(), 'gensim_word2vec.tst') + def _rule(word, count, min_count): if word == "human": return utils.RULE_DISCARD # throw out else: return utils.RULE_DEFAULT # apply default rule, i.e. min_count + class TestWord2VecModel(unittest.TestCase): def testPersistence(self): """Test storing/loading the entire model.""" @@ -93,9 +95,11 @@ def testPersistenceWord2VecFormat(self): model = word2vec.Word2Vec(sentences, min_count=1) model.init_sims() model.save_word2vec_format(testfile(), binary=True) - binary_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True, norm_only=False) + binary_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True) + binary_model.init_sims(replace=False) self.assertTrue(numpy.allclose(model['human'], binary_model['human'])) - norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True, norm_only=True) + norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True) + norm_only_model.init_sims(replace=True) self.assertFalse(numpy.allclose(model['human'], norm_only_model['human'])) self.assertTrue(numpy.allclose(model.syn0norm[model.vocab['human'].index], norm_only_model['human'])) @@ -104,9 +108,11 @@ def testPersistenceWord2VecFormatNonBinary(self): model = word2vec.Word2Vec(sentences, min_count=1) model.init_sims() model.save_word2vec_format(testfile(), binary=False) - text_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False, norm_only=False) + text_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False) + text_model.init_sims(False) self.assertTrue(numpy.allclose(model['human'], text_model['human'], atol=1e-6)) - norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False, norm_only=True) + norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False) + norm_only_model.init_sims(True) self.assertFalse(numpy.allclose(model['human'], norm_only_model['human'], atol=1e-6)) self.assertTrue(numpy.allclose(model.syn0norm[model.vocab['human'].index], norm_only_model['human'], atol=1e-4)) @@ -120,10 +126,17 @@ def testPersistenceWord2VecFormatWithVocab(self): binary_model_with_vocab = word2vec.Word2Vec.load_word2vec_format(testfile(), testvocab, binary=True) self.assertEqual(model.vocab['human'].count, binary_model_with_vocab.vocab['human'].count) - def test_zero_workers_mode(self): + def testPersistenceWord2VecFormatCombinationWithStandardPersistence(self): + """Test storing/loading the entire model and vocabulary in word2vec format chained with + saving and loading via `save` and `load` methods`.""" model = word2vec.Word2Vec(sentences, min_count=1) - model0 = word2vec.Word2Vec(sentences, min_count=1, workers=0) - self.models_equal(model,model0) + model.init_sims() + testvocab = os.path.join(tempfile.gettempdir(), 'gensim_word2vec.vocab') + model.save_word2vec_format(testfile(), testvocab, binary=True) + binary_model_with_vocab = word2vec.Word2Vec.load_word2vec_format(testfile(), testvocab, binary=True) + binary_model_with_vocab.save(testfile()) + binary_model_with_vocab = word2vec.Word2Vec.load(testfile()) + self.assertEqual(model.vocab['human'].count, binary_model_with_vocab.vocab['human'].count) def testLargeMmap(self): """Test storing/loading the entire model.""" @@ -191,8 +204,7 @@ def testScoring(self): # just score and make sure they exist scores = model.score(sentences, len(sentences)) - self.assertEqual(len(scores),len(sentences)) - + self.assertEqual(len(scores), len(sentences)) def testLocking(self): """Test word2vec training doesn't change locked vectors.""" @@ -209,8 +221,8 @@ def testLocking(self): model.syn0_lockf[0] = 0.0 model.train(corpus) - self.assertFalse((unlocked1==model.syn0[1]).all()) # unlocked vector should vary - self.assertTrue((locked0==model.syn0[0]).all()) # locked vector should not vary + self.assertFalse((unlocked1 == model.syn0[1]).all()) # unlocked vector should vary + self.assertTrue((locked0 == model.syn0[0]).all()) # locked vector should not vary def model_sanity(self, model, train=True): """Even tiny models trained on LeeCorpus should pass these sanity checks""" @@ -219,11 +231,11 @@ def model_sanity(self, model, train=True): model.build_vocab(list_corpus) orig0 = numpy.copy(model.syn0[0]) model.train(list_corpus) - self.assertFalse((orig0==model.syn0[1]).all()) # vector should vary after training + self.assertFalse((orig0 == model.syn0[1]).all()) # vector should vary after training sims = model.most_similar('war', topn=len(model.index2word)) t_rank = [word for word, score in sims].index('terrorism') # in >200 calibration runs w/ calling parameters, 'terrorism' in 50-most_sim for 'war' - self.assertLess(t_rank, 70) + self.assertLess(t_rank, 50) war_vec = model['war'] sims2 = model.most_similar([war_vec], topn=51) self.assertTrue('war' in [word for word, score in sims2]) @@ -394,6 +406,7 @@ def testLineSentenceWorksWithNormalFile(self): self.assertEqual(words, utils.to_unicode(orig.readline()).split()) #endclass TestWord2VecSentenceIterators + if not hasattr(TestWord2VecModel, 'assertLess'): # workaround for python 2.6 def assertLess(self, a, b, msg=None): @@ -401,7 +414,10 @@ def assertLess(self, a, b, msg=None): setattr(TestWord2VecModel, 'assertLess', assertLess) + if __name__ == '__main__': - logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG) - logging.info("using optimization %s" % word2vec.FAST_VERSION) + logging.basicConfig( + format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', + level=logging.DEBUG) + logging.info("using optimization %s", word2vec.FAST_VERSION) unittest.main() From ac889b3f61eb2e9878146dffdc0956297b54e757 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Fri, 15 Jan 2016 02:13:54 +0100 Subject: [PATCH 12/33] For #538: slightly relaxed sanity check demands (because now default vector size is 100, not 200). --- gensim/test/test_word2vec.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index b377071b17..ac8b55f77a 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -234,8 +234,8 @@ def model_sanity(self, model, train=True): self.assertFalse((orig0 == model.syn0[1]).all()) # vector should vary after training sims = model.most_similar('war', topn=len(model.index2word)) t_rank = [word for word, score in sims].index('terrorism') - # in >200 calibration runs w/ calling parameters, 'terrorism' in 50-most_sim for 'war' - self.assertLess(t_rank, 50) + # in >200 calibration runs w/ calling parameters, 'terrorism' in 60-most_sim for 'war' + self.assertLess(t_rank, 60) war_vec = model['war'] sims2 = model.most_similar([war_vec], topn=51) self.assertTrue('war' in [word for word, score in sims2]) From 92087c0278d1b64d9791b0427a3809709399fdfd Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 15 Jan 2016 14:35:08 +0100 Subject: [PATCH 13/33] Fixes as per @gojomo comments. --- gensim/models/word2vec.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 0802399f79..76e8b3e20a 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -342,8 +342,8 @@ class Word2Vec(utils.SaveLoad): """ def __init__( self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, - max_vocab_size=None, sample=1e-3, seed=1, workers=12, min_alpha=0.0001, - sg=0, hs=1, negative=0, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, + max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, + sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, trim_rule=None, sorted_vocab=1): """ Initialize the model from an iterable of `sentences`. Each sentence is a @@ -358,7 +358,7 @@ def __init__( you plan to initialize it in some other way. `sg` defines the training algorithm. By default (`sg=0`), CBOW is used. - Otherwise (`sg=1`), SkipGram is employed. + Otherwise (`sg=1`), skip-gram is employed. `size` is the dimensionality of the feature vectors. @@ -376,15 +376,16 @@ def __init__( need about 1GB of RAM. Set to `None` for no limit (default). `sample` = threshold for configuring which higher-frequency words are randomly downsampled; - default is 1e-3, useful value is 1e-5, 0 stands for off. + default is 1e-3, useful range is (0, 1e-5). `workers` = use this many worker threads to train the model (=faster training with multicore machines). - `hs` = if 1 (default), hierarchical sampling will be used for model training (if set to 0, negative sampling will be used). + `hs` = if 1, hierarchical softmax will be used for model training. + If set to 0 (default), and `negative` is non-zero, negative sampling will be used. `negative` = if > 0, negative sampling will be used, the int for negative specifies how many "noise words" should be drawn (usually between 5-20). - Default is 0, thus hierarchical softmax is used. + Default is 5. If set to 0, hierarchical softmax is used instead. `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used. @@ -1614,7 +1615,7 @@ def __iter__(self): from gensim.models.word2vec import Word2Vec # avoid referencing __main__ in pickle seterr(all='raise') # don't ignore numpy errors - + parser = argparse.ArgumentParser() parser.add_argument("-train", help="Use text data from file TRAIN to train the model", required=True) parser.add_argument("-output", help="Use file OUTPUT to save the resulting word vectors") @@ -1638,9 +1639,9 @@ def __iter__(self): skipgram = 0 corpus = LineSentence(args.train) - + model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window,sample=args.sample,sg=skipgram,hs=args.hs,negative=args.negative,cbow_mean=1,iter=args.iter) - + if args.output: outfile = args.output model.save_word2vec_format(outfile, binary=args.binary) @@ -1651,7 +1652,7 @@ def __iter__(self): model.save_word2vec_format(outfile + '.model.bin', binary=True) else: model.save_word2vec_format(outfile + '.model.txt', binary=False) - + if args.accuracy: questions_file = args.accuracy model.accuracy(questions_file) From 06785b557db76ef574615f83591f4cc5c27d6ceb Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 15 Jan 2016 14:57:26 +0100 Subject: [PATCH 14/33] Test fixes due to negative sampling becoming default behavior. --- gensim/test/test_word2vec.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index ac8b55f77a..b227a5846c 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -160,14 +160,16 @@ def testVocab(self): self.assertTrue(len(model.vocab) == 6981) # with min_count=1, we're not throwing away anything, so make sure the word counts add up to be the entire corpus self.assertEqual(sum(v.count for v in model.vocab.values()), total_words) - # make sure the binary codes are correct - numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) + if self.hs: + # make sure the binary codes are correct + numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) # test building vocab with default params model = word2vec.Word2Vec() model.build_vocab(corpus) self.assertTrue(len(model.vocab) == 1750) - numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) + if self.hs: + numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) # no input => "RuntimeError: you must first build vocabulary before training the model" self.assertRaises(RuntimeError, word2vec.Word2Vec, []) @@ -182,7 +184,8 @@ def testTraining(self): model.build_vocab(sentences) self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) - self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + if self.hs: + self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) model.train(sentences) sims = model.most_similar('graph', topn=10) @@ -200,7 +203,7 @@ def testTraining(self): def testScoring(self): """Test word2vec scoring.""" - model = word2vec.Word2Vec(sentences, size=2, min_count=1) + model = word2vec.Word2Vec(sentences, size=2, min_count=1, hs=1) # just score and make sure they exist scores = model.score(sentences, len(sentences)) @@ -270,7 +273,8 @@ def testTrainingCbow(self): model = word2vec.Word2Vec(size=2, min_count=1, sg=0) model.build_vocab(sentences) self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) - self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + if self.hs: + self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) model.train(sentences) sims = model.most_similar('graph', topn=10) From 3ac5fd4ecf410db73293d54d0a4f6e2faed36dc7 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 15 Jan 2016 15:10:44 +0100 Subject: [PATCH 15/33] Commented out tests which work for HS only. --- gensim/test/test_word2vec.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index b227a5846c..0c4818292e 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -160,16 +160,14 @@ def testVocab(self): self.assertTrue(len(model.vocab) == 6981) # with min_count=1, we're not throwing away anything, so make sure the word counts add up to be the entire corpus self.assertEqual(sum(v.count for v in model.vocab.values()), total_words) - if self.hs: - # make sure the binary codes are correct - numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) + # make sure the binary codes are correct + # numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) # test building vocab with default params model = word2vec.Word2Vec() model.build_vocab(corpus) self.assertTrue(len(model.vocab) == 1750) - if self.hs: - numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) + #numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) # no input => "RuntimeError: you must first build vocabulary before training the model" self.assertRaises(RuntimeError, word2vec.Word2Vec, []) @@ -184,8 +182,7 @@ def testTraining(self): model.build_vocab(sentences) self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) - if self.hs: - self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + # self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) model.train(sentences) sims = model.most_similar('graph', topn=10) @@ -273,8 +270,7 @@ def testTrainingCbow(self): model = word2vec.Word2Vec(size=2, min_count=1, sg=0) model.build_vocab(sentences) self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) - if self.hs: - self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + # self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) model.train(sentences) sims = model.most_similar('graph', topn=10) From e0ac3d2a88f68b8da9724c98d218569a525d7387 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Sat, 16 Jan 2016 01:00:23 +0100 Subject: [PATCH 16/33] Fix for #538. --- gensim/models/word2vec.py | 2 +- gensim/test/test_word2vec.py | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 76e8b3e20a..633f8dd61f 100755 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -385,7 +385,7 @@ def __init__( `negative` = if > 0, negative sampling will be used, the int for negative specifies how many "noise words" should be drawn (usually between 5-20). - Default is 5. If set to 0, hierarchical softmax is used instead. + Default is 5. If set to 0, no negative samping is used. `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used. diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index 0c4818292e..ca290e8a65 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -155,19 +155,19 @@ def testVocab(self): total_words = sum(len(sentence) for sentence in corpus) # try vocab building explicitly, using all words - model = word2vec.Word2Vec(min_count=1) + model = word2vec.Word2Vec(min_count=1, hs=1, negative=0) model.build_vocab(corpus) self.assertTrue(len(model.vocab) == 6981) # with min_count=1, we're not throwing away anything, so make sure the word counts add up to be the entire corpus self.assertEqual(sum(v.count for v in model.vocab.values()), total_words) # make sure the binary codes are correct - # numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) + numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) # test building vocab with default params model = word2vec.Word2Vec() model.build_vocab(corpus) self.assertTrue(len(model.vocab) == 1750) - #numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) + numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) # no input => "RuntimeError: you must first build vocabulary before training the model" self.assertRaises(RuntimeError, word2vec.Word2Vec, []) @@ -178,11 +178,11 @@ def testVocab(self): def testTraining(self): """Test word2vec training.""" # build vocabulary, don't train yet - model = word2vec.Word2Vec(size=2, min_count=1) + model = word2vec.Word2Vec(size=2, min_count=1, hs=1, negative=0) model.build_vocab(sentences) self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) - # self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) model.train(sentences) sims = model.most_similar('graph', topn=10) @@ -195,12 +195,12 @@ def testTraining(self): self.assertEqual(sims, sims2) # build vocab and train in one step; must be the same as above - model2 = word2vec.Word2Vec(sentences, size=2, min_count=1) + model2 = word2vec.Word2Vec(sentences, size=2, min_count=1, hs=1, negative=0) self.models_equal(model, model2) def testScoring(self): """Test word2vec scoring.""" - model = word2vec.Word2Vec(sentences, size=2, min_count=1, hs=1) + model = word2vec.Word2Vec(sentences, size=2, min_count=1, hs=1, negative=0) # just score and make sure they exist scores = model.score(sentences, len(sentences)) @@ -234,8 +234,8 @@ def model_sanity(self, model, train=True): self.assertFalse((orig0 == model.syn0[1]).all()) # vector should vary after training sims = model.most_similar('war', topn=len(model.index2word)) t_rank = [word for word, score in sims].index('terrorism') - # in >200 calibration runs w/ calling parameters, 'terrorism' in 60-most_sim for 'war' - self.assertLess(t_rank, 60) + # in >200 calibration runs w/ calling parameters, 'terrorism' in 50-most_sim for 'war' + self.assertLess(t_rank, 50) war_vec = model['war'] sims2 = model.most_similar([war_vec], topn=51) self.assertTrue('war' in [word for word, score in sims2]) @@ -267,10 +267,10 @@ def testTrainingCbow(self): """Test CBOW word2vec training.""" # to test training, make the corpus larger by repeating its sentences over and over # build vocabulary, don't train yet - model = word2vec.Word2Vec(size=2, min_count=1, sg=0) + model = word2vec.Word2Vec(size=2, min_count=1, sg=0, hs=1, negative=0) model.build_vocab(sentences) self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) - # self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) model.train(sentences) sims = model.most_similar('graph', topn=10) From 0aad9776402bf0bfcb81edbaba5e0c5122083021 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Sat, 16 Jan 2016 01:16:14 +0100 Subject: [PATCH 17/33] Yet another fix. --- gensim/models/word2vec.py | 48 ++++++++++++++++++++---------------- gensim/test/test_word2vec.py | 9 +++---- 2 files changed, 31 insertions(+), 26 deletions(-) mode change 100755 => 100644 gensim/models/word2vec.py diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py old mode 100755 new mode 100644 index 633f8dd61f..acff2c8660 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -344,7 +344,7 @@ def __init__( self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, - trim_rule=None, sorted_vocab=1): + trim_rule=None, sorted_vocab=1, 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. @@ -404,6 +404,11 @@ def __init__( `sorted_vocab` = if 1 (default), sort the vocabulary by descending frequency before assigning word indexes. + + `batch_words` = target size (in words) for batches of examples passed to worker threads (and + thus cython routines). Default is 10000. (Larger batches can be passed if individual + texts are longer, but the cython code may truncate.) + """ self.vocab = {} # mapping from a word (string) to a Vocab object self.index2word = [] # map from a word's matrix index (int) to word (string) @@ -431,6 +436,7 @@ def __init__( self.train_count = 0 self.total_train_time = 0 self.sorted_vocab = sorted_vocab + self.batch_words = batch_words if sentences is not None: if isinstance(sentences, GeneratorType): @@ -669,7 +675,7 @@ def _raw_word_count(self, job): """Return the number of words in a given job.""" return sum(len(sentence) for sentence in job) - def train(self, sentences, total_words=None, word_count=0, batch_words=None, + def train(self, sentences, total_words=None, word_count=0, total_examples=None, 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). @@ -690,7 +696,6 @@ def train(self, sentences, total_words=None, word_count=0, batch_words=None, self.neg_labels = zeros(self.negative + 1) self.neg_labels[0] = 1. - batch_words = min(batch_words or MAX_WORDS_IN_BATCH, MAX_WORDS_IN_BATCH) logger.info( "training model with %i workers on %i vocabulary and %i features, " "using sg=%s hs=%s sample=%s negative=%s", @@ -709,7 +714,7 @@ def train(self, sentences, total_words=None, word_count=0, batch_words=None, else: raise ValueError("you must provide either total_words or total_examples, to enable alpha and progress calculations") - self.jobs_finished, self.job_no, self.jobs_left = False, 0, 0 + job_tally = 0 if self.iter > 1: sentences = utils.RepeatCorpusNTimes(sentences, self.iter) @@ -728,7 +733,6 @@ def worker_loop(): break # no more jobs => quit this worker sentences, alpha = job tally, raw_tally = self._do_train_job(sentences, alpha, (work, neu1)) - self.jobs_left -= 1 progress_queue.put((len(sentences), tally, raw_tally)) # report back progress jobs_processed += 1 logger.debug("worker exiting, processed %i jobs", jobs_processed) @@ -738,12 +742,13 @@ def job_producer(): job_batch, batch_size = [], 0 pushed_words, pushed_examples = 0, 0 next_alpha = self.alpha + job_no = 0 for sent_idx, sentence in enumerate(sentences): sentence_length = self._raw_word_count([sentence]) # can we fit this sentence into the existing job batch? - if batch_size + sentence_length <= batch_words: + if batch_size + sentence_length <= self.batch_words: # yes => add it to the current job job_batch.append(sentence) batch_size += sentence_length @@ -751,9 +756,8 @@ def job_producer(): # no => submit the existing job logger.debug( "queueing job #%i (%i words, %i sentences) at alpha %.05f", - self.job_no, batch_size, len(job_batch), next_alpha) - self.job_no += 1 - self.jobs_left += 1 + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 job_queue.put((job_batch, next_alpha)) # update the learning rate for the next job @@ -776,15 +780,11 @@ def job_producer(): if job_batch: logger.debug( "queueing job #%i (%i words, %i sentences) at alpha %.05f", - self.job_no, batch_size, len(job_batch), next_alpha) - self.job_no += 1 - self.jobs_left += 1 + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 job_queue.put((job_batch, next_alpha)) - self.jobs_finished = True - logger.info("reached end of input; waiting to finish %i outstanding jobs", self.jobs_left) - - if self.job_no == 0 and self.train_count == 0: + if job_no == 0 and self.train_count == 0: logger.warning( "train() called with an empty iterator (if not intended, " "be sure to provide a corpus that offers restartable " @@ -793,14 +793,15 @@ def job_producer(): # give the workers heads up that they can finish -- no more work! for _ in xrange(self.workers): - job_queue.put(None) # no need to increase job_no - logger.debug("job loop exiting, total %i jobs", self.job_no) + job_queue.put(None) + logger.debug("job loop exiting, total %i jobs", job_no) # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( job_queue = Queue(maxsize=queue_factor * self.workers) progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + unfinished_worker_count = len(workers) workers.append(threading.Thread(target=job_producer)) for thread in workers: @@ -810,11 +811,14 @@ def job_producer(): example_count, trained_word_count, raw_word_count = 0, 0, word_count start, next_report = default_timer(), 1.0 - while not self.jobs_finished or self.jobs_left > 0: + while unfinished_worker_count > 0: report = progress_queue.get() # blocks if workers too slow - if report is None: + if report is None: # a thread reporting that it finished + unfinished_worker_count -= 1 + logger.info("worker thread finished; awaiting finish of %i more threads", unfinished_worker_count) continue examples, trained_words, raw_words = report + job_tally += 1 # update progress stats example_count += examples @@ -843,6 +847,8 @@ def job_producer(): logger.info( "training on %i raw words (%i effective words) took %.1fs, %.0f effective words/s", raw_word_count, trained_word_count, elapsed, trained_word_count / elapsed if elapsed else 0.0) + if job_tally < 10 * self.workers: + logger.warn("under 10 jobs per worker: consider setting a smaller `batch_words' for smoother alpha decay") # check that the input corpus hasn't changed during iteration if total_examples and total_examples != example_count: @@ -1657,4 +1663,4 @@ def __iter__(self): questions_file = args.accuracy model.accuracy(questions_file) - logging.info("finished running %s", program) + logging.info("finished running %s", program) \ No newline at end of file diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index ca290e8a65..0d89677eed 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -45,7 +45,6 @@ def __iter__(self): ['graph', 'minors', 'survey'] ] - def testfile(): # temporary data will be stored to this file return os.path.join(tempfile.gettempdir(), 'gensim_word2vec.tst') @@ -161,10 +160,10 @@ def testVocab(self): # with min_count=1, we're not throwing away anything, so make sure the word counts add up to be the entire corpus self.assertEqual(sum(v.count for v in model.vocab.values()), total_words) # make sure the binary codes are correct - numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) + numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) # test building vocab with default params - model = word2vec.Word2Vec() + model = word2vec.Word2Vec(hs=1, negative=0) model.build_vocab(corpus) self.assertTrue(len(model.vocab) == 1750) numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) @@ -253,8 +252,8 @@ def test_sg_neg(self): def test_cbow_hs(self): """Test CBOW w/ hierarchical softmax""" - model = word2vec.Word2Vec(sg=0, cbow_mean=1, alpha=0.05, window=5, hs=1, negative=0, - min_count=5, iter=10, workers=2) + model = word2vec.Word2Vec(sg=0, cbow_mean=1, alpha=0.05, window=8, hs=1, negative=0, + min_count=5, iter=10, workers=2, batch_words=1000) self.model_sanity(model) def test_cbow_neg(self): From e4eb8ba525631e3e8d47b97e1e43ae1e74931886 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Sat, 16 Jan 2016 01:24:07 +0100 Subject: [PATCH 18/33] Merging. --- gensim/models/word2vec.py | 1666 ++++++++++++++++++++++++++++++++++ gensim/test/test_word2vec.py | 422 +++++++++ 2 files changed, 2088 insertions(+) create mode 100644 gensim/models/word2vec.py create mode 100644 gensim/test/test_word2vec.py diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py new file mode 100644 index 0000000000..acff2c8660 --- /dev/null +++ b/gensim/models/word2vec.py @@ -0,0 +1,1666 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + + +""" +Deep learning via word2vec's "skip-gram and CBOW models", using either +hierarchical softmax or negative sampling [1]_ [2]_. + +The training algorithms were originally ported from the C package https://code.google.com/p/word2vec/ +and extended with additional functionality. + +For a blog tutorial on gensim word2vec, with an interactive web app trained on GoogleNews, visit http://radimrehurek.com/2014/02/word2vec-tutorial/ + +**Make sure you have a C compiler before installing gensim, to use optimized (compiled) word2vec training** +(70x speedup compared to plain NumPy implementation [3]_). + +Initialize a model with e.g.:: + +>>> model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) + +Persist a model to disk with:: + +>>> model.save(fname) +>>> model = Word2Vec.load(fname) # you can continue training with the loaded model! + +The model can also be instantiated from an existing file on disk in the word2vec C format:: + + >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False) # C text format + >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.bin', binary=True) # C binary format + +You can perform various syntactic/semantic NLP word tasks with the model. Some of them +are already built-in:: + + >>> model.most_similar(positive=['woman', 'king'], negative=['man']) + [('queen', 0.50882536), ...] + + >>> model.doesnt_match("breakfast cereal dinner lunch".split()) + 'cereal' + + >>> model.similarity('woman', 'man') + 0.73723527 + + >>> model['computer'] # raw numpy vector of a word + array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32) + +and so on. + +If you're finished training a model (=no more updates, only querying), you can do + + >>> model.init_sims(replace=True) + +to trim unneeded model memory = use (much) less RAM. + +Note that there is a :mod:`gensim.models.phrases` module which lets you automatically +detect phrases longer than one word. Using phrases, you can learn a word2vec model +where "words" are actually multiword expressions, such as `new_york_times` or `financial_crisis`: + +>>> bigram_transformer = gensim.models.Phrases(sentences) +>>> model = Word2Vec(bigram_transformer[sentences], size=100, ...) + +.. [1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013. +.. [2] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their Compositionality. + In Proceedings of NIPS, 2013. +.. [3] Optimizing word2vec in gensim, http://radimrehurek.com/2013/09/word2vec-in-python-part-two-optimizing/ +""" +from __future__ import division # py3 "true division" + +import logging +import sys +import os +import heapq +from timeit import default_timer +from copy import deepcopy +from collections import defaultdict +import threading +import itertools + +from gensim.utils import keep_vocab_item + +try: + from queue import Queue, Empty +except ImportError: + from Queue import Queue, Empty + +from numpy import exp, log, dot, zeros, outer, random, dtype, float32 as REAL,\ + uint32, seterr, array, uint8, vstack, fromstring, sqrt, newaxis,\ + ndarray, empty, sum as np_sum, prod, ones, ascontiguousarray + +from gensim import utils, matutils # utility fnc for pickling, common scipy operations etc +from six import iteritems, itervalues, string_types +from six.moves import xrange +from types import GeneratorType + +logger = logging.getLogger(__name__) + +try: + from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow + from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow + from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH +except ImportError: + # failed... fall back to plain numpy (20-80x slower training than the above) + FAST_VERSION = -1 + MAX_WORDS_IN_BATCH = 10000 + + def train_batch_sg(model, sentences, alpha, work=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 `Word2Vec.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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) + for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): + # don't train on the `word` itself + if pos2 != pos: + train_sg_pair(model, model.index2word[word.index], word2.index, alpha) + result += len(word_vocabs) + return result + + 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 `Word2Vec.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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 + 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)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + train_cbow_pair(model, word, word2_indices, l1, alpha) + result += len(word_vocabs) + return result + + def score_sentence_sg(model, sentence, work=None): + """ + Obtain likelihood score for a single sentence in a fitted skip-gram representaion. + + The sentence is a list of Vocab objects (or None, when the corresponding + word is not in the vocabulary). Called internally from `Word2Vec.score()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + + log_prob_sentence = 0.0 + if model.negative: + raise RuntimeError("scoring is only available for HS=True") + + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + for pos, word in enumerate(word_vocabs): + if word is None: + continue # OOV word in the input sentence => skip + + # now go over all words from the window, predicting each one in turn + start = max(0, pos - model.window) + for pos2, word2 in enumerate(word_vocabs[start : pos + model.window + 1], start): + # don't train on OOV words and on the `word` itself + if word2 is not None and pos2 != pos: + log_prob_sentence += score_sg_pair(model, word, word2) + + return log_prob_sentence + + def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): + """ + Obtain likelihood score for a single sentence in a fitted CBOW representaion. + + The sentence is a list of Vocab objects (or None, where the corresponding + word is not in the vocabulary. Called internally from `Word2Vec.score()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + log_prob_sentence = 0.0 + if model.negative: + raise RuntimeError("scoring is only available for HS=True") + + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + for pos, word in enumerate(word_vocabs): + if word is None: + continue # OOV word in the input sentence => skip + + start = max(0, pos - model.window) + window_pos = enumerate(word_vocabs[start:(pos + model.window + 1)], start) + word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x layer1_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + log_prob_sentence += score_cbow_pair(model, word, word2_indices, l1) + + return log_prob_sentence + + +def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_hidden=True, + context_vectors=None, context_locks=None): + if context_vectors is None: + context_vectors = model.syn0 + if context_locks is None: + context_locks = model.syn0_lockf + + if word not in model.vocab: + return + predict_word = model.vocab[word] # target word (NN output) + + l1 = context_vectors[context_index] # input word (NN input/projection layer) + lock_factor = context_locks[context_index] + + neu1e = zeros(l1.shape) + + if model.hs: + # work on the entire tree at once, to push as much work into numpy's C routines as possible (performance) + l2a = deepcopy(model.syn1[predict_word.point]) # 2d matrix, codelen x layer1_size + fa = 1.0 / (1.0 + exp(-dot(l1, l2a.T))) # propagate hidden -> output + ga = (1 - predict_word.code - fa) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1[predict_word.point] += outer(ga, l1) # learn hidden -> output + neu1e += dot(ga, l2a) # save error + + if model.negative: + # use this word (label = 1) + `negative` other random words not from this sentence (label = 0) + word_indices = [predict_word.index] + while len(word_indices) < model.negative + 1: + w = model.cum_table.searchsorted(model.random.randint(model.cum_table[-1])) + if w != predict_word.index: + word_indices.append(w) + l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size + fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output + gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output + neu1e += dot(gb, l2b) # save error + + if learn_vectors: + l1 += neu1e * lock_factor # learn input -> hidden (mutates model.syn0[word2.index], if that is l1) + return neu1e + + +def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=True, learn_hidden=True): + neu1e = zeros(l1.shape) + + if model.hs: + l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size + fa = 1. / (1. + exp(-dot(l1, l2a.T))) # propagate hidden -> output + ga = (1. - word.code - fa) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1[word.point] += outer(ga, l1) # learn hidden -> output + neu1e += dot(ga, l2a) # save error + + if model.negative: + # use this word (label = 1) + `negative` other random words not from this sentence (label = 0) + word_indices = [word.index] + while len(word_indices) < model.negative + 1: + w = model.cum_table.searchsorted(model.random.randint(model.cum_table[-1])) + if w != word.index: + word_indices.append(w) + l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size + fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output + gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output + neu1e += dot(gb, l2b) # save error + + if learn_vectors: + # learn input -> hidden, here for all words in the window separately + if not model.cbow_mean and input_word_indices: + neu1e /= len(input_word_indices) + for i in input_word_indices: + model.syn0[i] += neu1e * model.syn0_lockf[i] + + return neu1e + + +def score_sg_pair(model, word, word2): + l1 = model.syn0[word2.index] + l2a = deepcopy(model.syn1[word.point]) # 2d matrix, codelen x layer1_size + sgn = -1.0**word.code # ch function, 0-> 1, 1 -> -1 + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + return sum(lprob) + + +def score_cbow_pair(model, word, word2_indices, l1): + l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size + sgn = -1.0**word.code # ch function, 0-> 1, 1 -> -1 + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + return sum(lprob) + + +class Vocab(object): + """ + A single vocabulary item, used internally for collecting per-word frequency/sampling info, + and for constructing binary trees (incl. both word leaves and inner nodes). + + """ + def __init__(self, **kwargs): + self.count = 0 + self.__dict__.update(kwargs) + + def __lt__(self, other): # used for sorting in a priority queue + return self.count < other.count + + def __str__(self): + vals = ['%s:%r' % (key, self.__dict__[key]) for key in sorted(self.__dict__) if not key.startswith('_')] + return "%s(%s)" % (self.__class__.__name__, ', '.join(vals)) + + +class Word2Vec(utils.SaveLoad): + """ + Class for training, using and evaluating neural networks described in https://code.google.com/p/word2vec/ + + The model can be stored/loaded via its `save()` and `load()` methods, or stored/loaded in a format + compatible with the original word2vec implementation via `save_word2vec_format()` and `load_word2vec_format()`. + + """ + def __init__( + self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, + max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, + sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, + trim_rule=None, sorted_vocab=1, 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. + + The `sentences` iterable can be simply a list, but for larger corpora, + consider an iterable that streams the sentences directly from disk/network. + See :class:`BrownCorpus`, :class:`Text8Corpus` or :class:`LineSentence` in + this 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` defines the training algorithm. By default (`sg=0`), CBOW is used. + Otherwise (`sg=1`), skip-gram is employed. + + `size` is the dimensionality of the feature vectors. + + `window` is the maximum distance between the current and predicted word within a sentence. + + `alpha` is the initial learning rate (will linearly drop to zero as training progresses). + + `seed` = for the random number generator. Initial vectors for each + word are seeded with a hash of the concatenation of word + str(seed). + + `min_count` = ignore all words with total frequency lower than this. + + `max_vocab_size` = limit 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 (default). + + `sample` = threshold for configuring which higher-frequency words are randomly downsampled; + default is 1e-3, useful range is (0, 1e-5). + + `workers` = use this many worker threads to train the model (=faster training with multicore machines). + + `hs` = if 1, hierarchical softmax will be used for model training. + If set to 0 (default), and `negative` is non-zero, negative sampling will be used. + + `negative` = if > 0, negative sampling will be used, the int for negative + specifies how many "noise words" should be drawn (usually between 5-20). + Default is 5. If set to 0, no negative samping is used. + + `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. + Only applies when cbow is used. + + `hashfxn` = hash function to use to randomly initialize weights, for increased + training reproducibility. Default is Python's rudimentary built in hash function. + + `iter` = number of iterations (epochs) over the corpus. + + `trim_rule` = 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), or a callable that accepts parameters (word, count, min_count) and + returns either util.RULE_DISCARD, util.RULE_KEEP or util.RULE_DEFAULT. + Note: The rule, if given, is only used prune vocabulary during build_vocab() and is not stored as part + of the model. + + `sorted_vocab` = if 1 (default), sort the vocabulary by descending frequency before + assigning word indexes. + + `batch_words` = target size (in words) for batches of examples passed to worker threads (and + thus cython routines). Default is 10000. (Larger batches can be passed if individual + texts are longer, but the cython code may truncate.) + + """ + self.vocab = {} # mapping from a word (string) to a Vocab object + self.index2word = [] # map from a word's matrix index (int) to word (string) + self.sg = int(sg) + self.cum_table = None # for negative sampling + self.vector_size = int(size) + self.layer1_size = int(size) + if size % 4 != 0: + logger.warning("consider setting layer size to a multiple of 4 for greater performance") + self.alpha = float(alpha) + self.window = int(window) + self.max_vocab_size = max_vocab_size + self.seed = seed + self.random = random.RandomState(seed) + self.min_count = min_count + self.sample = sample + self.workers = int(workers) + self.min_alpha = float(min_alpha) + self.hs = hs + self.negative = negative + self.cbow_mean = int(cbow_mean) + self.hashfxn = hashfxn + self.iter = iter + self.null_word = null_word + self.train_count = 0 + self.total_train_time = 0 + self.sorted_vocab = sorted_vocab + self.batch_words = batch_words + + if sentences is not None: + if isinstance(sentences, GeneratorType): + raise TypeError("You can't pass a generator as the sentences argument. Try an iterator.") + self.build_vocab(sentences, trim_rule=trim_rule) + self.train(sentences) + + def make_cum_table(self, power=0.75, domain=2**31 - 1): + """ + Create a cumulative-distribution table using stored vocabulary word counts for + drawing random words in the negative-sampling training routines. + + To draw a word index, choose a random integer up to the maximum value in the + table (cum_table[-1]), then finding that integer's sorted insertion point + (as if by bisect_left or ndarray.searchsorted()). That insertion point is the + drawn index, coming up in proportion equal to the increment at that slot. + + Called internally from 'build_vocab()'. + """ + vocab_size = len(self.index2word) + self.cum_table = zeros(vocab_size, dtype=uint32) + # compute sum of all power (Z in paper) + train_words_pow = float(sum([self.vocab[word].count**power for word in self.vocab])) + cumulative = 0.0 + for word_index in range(vocab_size): + cumulative += self.vocab[self.index2word[word_index]].count**power / train_words_pow + self.cum_table[word_index] = round(cumulative * domain) + if len(self.cum_table) > 0: + assert self.cum_table[-1] == domain + + def create_binary_tree(self): + """ + Create a binary Huffman tree using stored vocabulary word counts. Frequent words + will have shorter binary codes. Called internally from `build_vocab()`. + + """ + logger.info("constructing a huffman tree from %i words", len(self.vocab)) + + # build the huffman tree + heap = list(itervalues(self.vocab)) + heapq.heapify(heap) + for i in xrange(len(self.vocab) - 1): + min1, min2 = heapq.heappop(heap), heapq.heappop(heap) + heapq.heappush(heap, Vocab(count=min1.count + min2.count, index=i + len(self.vocab), left=min1, right=min2)) + + # recurse over the tree, assigning a binary code to each vocabulary word + if heap: + max_depth, stack = 0, [(heap[0], [], [])] + while stack: + node, codes, points = stack.pop() + if node.index < len(self.vocab): + # leaf node => store its path from the root + node.code, node.point = codes, points + max_depth = max(len(codes), max_depth) + else: + # inner node => continue recursion + points = array(list(points) + [node.index - len(self.vocab)], dtype=uint32) + stack.append((node.left, array(list(codes) + [0], dtype=uint8), points)) + stack.append((node.right, array(list(codes) + [1], dtype=uint8), points)) + + logger.info("built huffman tree with maximum node depth %i", max_depth) + + def build_vocab(self, sentences, keep_raw_vocab=False, trim_rule=None): + """ + Build vocabulary from a sequence of sentences (can be a once-only generator stream). + Each sentence must be a list of unicode strings. + + """ + self.scan_vocab(sentences, trim_rule=trim_rule) # initial survey + self.scale_vocab(keep_raw_vocab=keep_raw_vocab, trim_rule=trim_rule) # trim by min_count & precalculate downsampling + self.finalize_vocab() # build tables & arrays + + def scan_vocab(self, sentences, progress_per=10000, trim_rule=None): + """Do an initial scan of all words appearing in sentences.""" + logger.info("collecting all words and their counts") + sentence_no = -1 + total_words = 0 + min_reduce = 1 + vocab = defaultdict(int) + for sentence_no, sentence in enumerate(sentences): + if sentence_no % progress_per == 0: + logger.info("PROGRESS: at sentence #%i, processed %i words, keeping %i word types", + sentence_no, sum(itervalues(vocab)) + total_words, len(vocab)) + for word in sentence: + vocab[word] += 1 + + if self.max_vocab_size and len(vocab) > self.max_vocab_size: + total_words += utils.prune_vocab(vocab, min_reduce, trim_rule=trim_rule) + min_reduce += 1 + + total_words += sum(itervalues(vocab)) + logger.info("collected %i word types from a corpus of %i raw words and %i sentences", + len(vocab), total_words, sentence_no + 1) + self.corpus_count = sentence_no + 1 + self.raw_vocab = vocab + + def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab=False, trim_rule=None): + """ + Apply vocabulary settings for `min_count` (discarding less-frequent words) + and `sample` (controlling the downsampling of more-frequent words). + + Calling with `dry_run=True` will only simulate the provided settings and + report the size of the retained vocabulary, effective corpus length, and + estimated memory requirements. Results are both printed via logging and + returned as a dict. + + Delete the raw vocabulary after the scaling is done to free up RAM, + unless `keep_raw_vocab` is set. + + """ + min_count = min_count or self.min_count + sample = sample or self.sample + + # Discard words less-frequent than min_count + if not dry_run: + self.index2word = [] + # make stored settings match these applied settings + self.min_count = min_count + self.sample = sample + self.vocab = {} + drop_unique, drop_total, retain_total, original_total = 0, 0, 0, 0 + retain_words = [] + for word, v in iteritems(self.raw_vocab): + if keep_vocab_item(word, v, min_count, trim_rule=trim_rule): + retain_words.append(word) + retain_total += v + original_total += v + if not dry_run: + self.vocab[word] = Vocab(count=v, index=len(self.index2word)) + self.index2word.append(word) + else: + drop_unique += 1 + drop_total += v + original_total += v + logger.info("min_count=%d retains %i unique words (drops %i)", + min_count, len(retain_words), drop_unique) + logger.info("min_count leaves %i word corpus (%i%% of original %i)", + retain_total, retain_total * 100 / max(original_total, 1), original_total) + + # Precalculate each vocabulary item's threshold for sampling + if not sample: + # no words downsampled + threshold_count = retain_total + elif sample < 1.0: + # traditional meaning: set parameter as proportion of total + threshold_count = sample * retain_total + else: + # new shorthand: sample >= 1 means downsample all words with higher count than sample + threshold_count = int(sample * (3 + sqrt(5)) / 2) + + downsample_total, downsample_unique = 0, 0 + for w in retain_words: + v = self.raw_vocab[w] + word_probability = (sqrt(v / threshold_count) + 1) * (threshold_count / v) + if word_probability < 1.0: + downsample_unique += 1 + downsample_total += word_probability * v + else: + word_probability = 1.0 + downsample_total += v + if not dry_run: + self.vocab[w].sample_int = int(round(word_probability * 2**32)) + + if not dry_run and not keep_raw_vocab: + logger.info("deleting the raw counts dictionary of %i items", len(self.raw_vocab)) + self.raw_vocab = defaultdict(int) + + logger.info("sample=%g downsamples %i most-common words", sample, downsample_unique) + logger.info("downsampling leaves estimated %i word corpus (%.1f%% of prior %i)", + downsample_total, downsample_total * 100.0 / max(retain_total, 1), retain_total) + + # return from each step: words-affected, resulting-corpus-size + report_values = {'drop_unique': drop_unique, 'retain_total': retain_total, + 'downsample_unique': downsample_unique, 'downsample_total': int(downsample_total)} + + # print extra memory estimates + report_values['memory'] = self.estimate_memory(vocab_size=len(retain_words)) + + return report_values + + def finalize_vocab(self): + """Build tables and model weights based on final vocabulary settings.""" + if not self.index2word: + self.scale_vocab() + if self.sorted_vocab: + self.sort_vocab() + if self.hs: + # add info about each word's Huffman encoding + self.create_binary_tree() + if self.negative: + # build the table for drawing random words (for negative sampling) + self.make_cum_table() + if self.null_word: + # create null pseudo-word for padding when using concatenative L1 (run-of-words) + # this word is only ever input – never predicted – so count, huffman-point, etc doesn't matter + word, v = '\0', Vocab(count=1, sample_int=0) + v.index = len(self.vocab) + self.index2word.append(word) + self.vocab[word] = v + # set initial input/projection and hidden weights + self.reset_weights() + + def sort_vocab(self): + """Sort the vocabulary so the most frequent words have the lowest indexes.""" + if hasattr(self, 'syn0'): + raise RuntimeError("must sort before initializing vectors/weights") + self.index2word.sort(key=lambda word: self.vocab[word].count, reverse=True) + for i, word in enumerate(self.index2word): + self.vocab[word].index = i + + def reset_from(self, other_model): + """ + Borrow shareable pre-built structures (like vocab) from the other_model. Useful + if testing multiple models in parallel on the same corpus. + """ + self.vocab = other_model.vocab + self.index2word = other_model.index2word + self.cum_table = other_model.cum_table + self.corpus_count = other_model.corpus_count + self.reset_weights() + + 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)`. + """ + work, neu1 = inits + tally = 0 + if self.sg: + tally += train_batch_sg(self, sentences, alpha, work) + else: + tally += train_batch_cbow(self, sentences, alpha, work, neu1) + return tally, self._raw_word_count(sentences) + + def _raw_word_count(self, job): + """Return the number of words in a given job.""" + return sum(len(sentence) for sentence in job) + + def train(self, sentences, total_words=None, word_count=0, + total_examples=None, 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 Word2Vec, 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, either total_examples + (count of sentences) or total_words (count of raw words in sentences) should be provided, unless the + sentences are the same as those that were used to initially build the vocabulary. + + """ + if FAST_VERSION < 0: + import warnings + warnings.warn("C extension not loaded for Word2Vec, training will be slow. " + "Install a C compiler and reinstall gensim for fast training.") + 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. + + logger.info( + "training model with %i workers on %i vocabulary and %i features, " + "using sg=%s hs=%s sample=%s negative=%s", + self.workers, len(self.vocab), self.layer1_size, self.sg, + self.hs, self.sample, self.negative) + + if not self.vocab: + raise RuntimeError("you must first build vocabulary before training the model") + if not hasattr(self, 'syn0'): + raise RuntimeError("you must first finalize vocabulary before training the model") + + if total_words is None and total_examples is None: + if self.corpus_count: + total_examples = self.corpus_count + logger.info("expecting %i sentences, matching count from corpus used for vocabulary survey", total_examples) + else: + raise ValueError("you must provide either total_words or total_examples, to enable alpha and progress calculations") + + job_tally = 0 + + if self.iter > 1: + sentences = utils.RepeatCorpusNTimes(sentences, self.iter) + total_words = total_words and total_words * self.iter + total_examples = total_examples and total_examples * self.iter + + def worker_loop(): + """Train the model, lifting lists of sentences from the job_queue.""" + work = matutils.zeros_aligned(self.layer1_size, dtype=REAL) # per-thread private work memory + neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) + jobs_processed = 0 + while True: + job = job_queue.get() + if job is None: + progress_queue.put(None) + break # no more jobs => quit this worker + sentences, alpha = job + tally, raw_tally = self._do_train_job(sentences, alpha, (work, neu1)) + progress_queue.put((len(sentences), tally, raw_tally)) # report back progress + jobs_processed += 1 + logger.debug("worker exiting, processed %i jobs", jobs_processed) + + def job_producer(): + """Fill jobs queue using the input `sentences` iterator.""" + job_batch, batch_size = [], 0 + pushed_words, pushed_examples = 0, 0 + next_alpha = self.alpha + job_no = 0 + + for sent_idx, sentence in enumerate(sentences): + sentence_length = self._raw_word_count([sentence]) + + # can we fit this sentence into the existing job batch? + if batch_size + sentence_length <= self.batch_words: + # yes => add it to the current job + job_batch.append(sentence) + batch_size += sentence_length + else: + # no => submit the existing job + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 + job_queue.put((job_batch, next_alpha)) + + # update the learning rate for the next job + if self.min_alpha < next_alpha: + if total_examples: + # examples-based decay + pushed_examples += len(job_batch) + progress = 1.0 * pushed_examples / total_examples + else: + # words-based decay + pushed_words += self._raw_word_count(job_batch) + progress = 1.0 * pushed_words / total_words + next_alpha = self.alpha - (self.alpha - self.min_alpha) * progress + next_alpha = max(self.min_alpha, next_alpha) + + # add the sentence that didn't fit as the first item of a new job + job_batch, batch_size = [sentence], sentence_length + + # add the last job too (may be significantly smaller than batch_words) + if job_batch: + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 + job_queue.put((job_batch, next_alpha)) + + if job_no == 0 and self.train_count == 0: + logger.warning( + "train() called with an empty iterator (if not intended, " + "be sure to provide a corpus that offers restartable " + "iteration = an iterable)." + ) + + # give the workers heads up that they can finish -- no more work! + for _ in xrange(self.workers): + job_queue.put(None) + logger.debug("job loop exiting, total %i jobs", job_no) + + # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( + job_queue = Queue(maxsize=queue_factor * self.workers) + progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) + + workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + unfinished_worker_count = len(workers) + workers.append(threading.Thread(target=job_producer)) + + for thread in workers: + thread.daemon = True # make interrupting the process with ctrl+c easier + thread.start() + + example_count, trained_word_count, raw_word_count = 0, 0, word_count + start, next_report = default_timer(), 1.0 + + while unfinished_worker_count > 0: + report = progress_queue.get() # blocks if workers too slow + if report is None: # a thread reporting that it finished + unfinished_worker_count -= 1 + logger.info("worker thread finished; awaiting finish of %i more threads", unfinished_worker_count) + continue + examples, trained_words, raw_words = report + job_tally += 1 + + # update progress stats + example_count += examples + trained_word_count += trained_words # only words in vocab & sampled + raw_word_count += raw_words + + # log progress once every report_delay seconds + elapsed = default_timer() - start + if elapsed >= next_report: + if total_examples: + # examples-based progress % + logger.info( + "PROGRESS: at %.2f%% examples, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * example_count / total_examples, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + else: + # words-based progress % + logger.info( + "PROGRESS: at %.2f%% words, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * raw_word_count / total_words, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + next_report = elapsed + report_delay + + # all done; report the final stats + elapsed = default_timer() - start + logger.info( + "training on %i raw words (%i effective words) took %.1fs, %.0f effective words/s", + raw_word_count, trained_word_count, elapsed, trained_word_count / elapsed if elapsed else 0.0) + if job_tally < 10 * self.workers: + logger.warn("under 10 jobs per worker: consider setting a smaller `batch_words' for smoother alpha decay") + + # check that the input corpus hasn't changed during iteration + if total_examples and total_examples != example_count: + logger.warn("supplied example count (%i) did not equal expected count (%i)", example_count, total_examples) + if total_words and total_words != raw_word_count: + logger.warn("supplied raw word count (%i) did not equal expected count (%i)", raw_word_count, total_words) + + self.train_count += 1 # number of times train() has been called + self.total_train_time += elapsed + self.clear_sims() + return trained_word_count + + # basics copied from the train() function + def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor=2, report_delay=1): + """ + Score the log probability for a sequence of sentences (can be a once-only generator stream). + Each sentence must be a list of unicode strings. + This does not change the fitted model in any way (see Word2Vec.train() for that) + + Note that you should specify total_sentences; we'll run into problems if you ask to + score more than this number of sentences but it is inefficient to set the value too high. + + See the article by [taddy]_ and the gensim demo at [deepir]_ for examples of how to use such scores in document classification. + + .. [taddy] Taddy, Matt. Document Classification by Inversion of Distributed Language Representations, in Proceedings of the 2015 Conference of the Association of Computational Linguistics. + .. [deepir] https://github.com/TaddyLab/gensim/blob/deepir/docs/notebooks/deepir.ipynb + + """ + if FAST_VERSION < 0: + import warnings + warnings.warn("C extension compilation failed, scoring will be slow. " + "Install a C compiler and reinstall gensim for fastness.") + + logger.info( + "scoring sentences with %i workers on %i vocabulary and %i features, " + "using sg=%s hs=%s sample=%s and negative=%s", + self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) + + if not self.vocab: + raise RuntimeError("you must first build vocabulary before scoring new data") + + if not self.hs: + raise RuntimeError("we have only implemented score for hs") + + def worker_loop(): + """Train the model, lifting lists of sentences from the jobs queue.""" + work = zeros(1, dtype=REAL) # for sg hs, we actually only need one memory loc (running sum) + neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) + while True: + job = job_queue.get() + if job is None: # signal to finish + break + ns = 0 + for sentence_id, sentence in job: + if sentence_id >= total_sentences: + break + if self.sg: + score = score_sentence_sg(self, sentence, work) + else: + score = score_sentence_cbow(self, sentence, work, neu1) + sentence_scores[sentence_id] = score + ns += 1 + progress_queue.put(ns) # report progress + + start, next_report = default_timer(), 1.0 + # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( + job_queue = Queue(maxsize=queue_factor * self.workers) + progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) + + workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + for thread in workers: + thread.daemon = True # make interrupting the process with ctrl+c easier + thread.start() + + sentence_count = 0 + sentence_scores = matutils.zeros_aligned(total_sentences, dtype=REAL) + + push_done = False + done_jobs = 0 + jobs_source = enumerate(utils.grouper(enumerate(sentences), chunksize)) + + # fill jobs queue with (id, sentence) job items + while True: + try: + job_no, items = next(jobs_source) + if (job_no - 1) * chunksize > total_sentences: + logger.warning( + "terminating after %i sentences (set higher total_sentences if you want more).", + total_sentences) + job_no -= 1 + raise StopIteration() + logger.debug("putting job #%i in the queue", job_no) + job_queue.put(items) + except StopIteration: + logger.info( + "reached end of input; waiting to finish %i outstanding jobs", + job_no - done_jobs + 1) + for _ in xrange(self.workers): + job_queue.put(None) # give the workers heads up that they can finish -- no more work! + push_done = True + try: + while done_jobs < (job_no + 1) or not push_done: + ns = progress_queue.get(push_done) # only block after all jobs pushed + sentence_count += ns + done_jobs += 1 + elapsed = default_timer() - start + if elapsed >= next_report: + logger.info( + "PROGRESS: at %.2f%% sentences, %.0f sentences/s", + 100.0 * sentence_count, sentence_count / elapsed) + next_report = elapsed + report_delay # don't flood log, wait report_delay seconds + else: + # loop ended by job count; really done + break + except Empty: + pass # already out of loop; continue to next push + + elapsed = default_timer() - start + self.clear_sims() + logger.info( + "scoring %i sentences took %.1fs, %.0f sentences/s", + sentence_count, elapsed, sentence_count / elapsed if elapsed else 0.0) + return sentence_scores[:sentence_count] + + def clear_sims(self): + self.syn0norm = None + + def reset_weights(self): + """Reset all projection weights to an initial (untrained) state, but keep the existing vocabulary.""" + logger.info("resetting layer weights") + self.syn0 = empty((len(self.vocab), self.vector_size), dtype=REAL) + # randomize weights vector by vector, rather than materializing a huge random matrix in RAM at once + for i in xrange(len(self.vocab)): + # construct deterministic seed from word AND seed argument + self.syn0[i] = self.seeded_vector(self.index2word[i] + str(self.seed)) + if self.hs: + self.syn1 = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + if self.negative: + self.syn1neg = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + self.syn0norm = None + + self.syn0_lockf = ones(len(self.vocab), dtype=REAL) # zeros suppress learning + + def seeded_vector(self, seed_string): + """Create one 'random' vector (but deterministic by seed_string)""" + # Note: built-in hash() may vary by Python version or even (in Py3.x) per launch + once = random.RandomState(self.hashfxn(seed_string) & 0xffffffff) + return (once.rand(self.vector_size) - 0.5) / self.vector_size + + def save_word2vec_format(self, fname, fvocab=None, binary=False): + """ + Store the input-hidden weight matrix in the same format used by the original + C word2vec-tool, for compatibility. + + """ + if fvocab is not None: + logger.info("storing vocabulary in %s" % (fvocab)) + with utils.smart_open(fvocab, 'wb') as vout: + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + vout.write(utils.to_utf8("%s %s\n" % (word, vocab.count))) + logger.info("storing %sx%s projection weights into %s" % (len(self.vocab), self.vector_size, fname)) + assert (len(self.vocab), self.vector_size) == self.syn0.shape + with utils.smart_open(fname, 'wb') as fout: + fout.write(utils.to_utf8("%s %s\n" % self.syn0.shape)) + # store in sorted order: most frequent words at the top + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + row = self.syn0[vocab.index] + if binary: + fout.write(utils.to_utf8(word) + b" " + row.tostring()) + else: + fout.write(utils.to_utf8("%s %s\n" % (word, ' '.join("%f" % val for val in row)))) + + @classmethod + def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', unicode_errors='strict'): + """ + Load the input-hidden weight matrix from the original C word2vec-tool format. + + Note that the information stored in the file is incomplete (the binary tree is missing), + so while you can query for word similarity etc., you cannot continue training + with a model loaded this way. + + `binary` is a boolean indicating whether the data is in binary word2vec format. + `norm_only` is a boolean indicating whether to only store normalised word2vec vectors in memory. + Word counts are read from `fvocab` filename, if set (this is the file generated + by `-save-vocab` flag of the original C tool). + + If you trained the C model using non-utf8 encoding for words, specify that + encoding in `encoding`. + + """ + counts = None + if fvocab is not None: + logger.info("loading word counts from %s", fvocab) + counts = {} + with utils.smart_open(fvocab) as fin: + for line in fin: + word, count = utils.to_unicode(line).strip().split() + counts[word] = int(count) + + logger.info("loading projection weights from %s", fname) + with utils.smart_open(fname) as fin: + header = utils.to_unicode(fin.readline(), encoding=encoding) + vocab_size, vector_size = map(int, header.split()) # throws for invalid file format + result = cls(size=vector_size) + result.syn0 = zeros((vocab_size, vector_size), dtype=REAL) + + def add_word(word, weights): + word_id = len(result.vocab) + if word in result.vocab: + logger.warning("duplicate word '%s' in %s, ignoring all but first", word, fname) + return + if counts is None: + # most common scenario: no vocab file given. just make up some bogus counts, in descending order + result.vocab[word] = Vocab(index=word_id, count=vocab_size - word_id) + elif word in counts: + # use count from the vocab file + result.vocab[word] = Vocab(index=word_id, count=counts[word]) + else: + # vocab file given, but word is missing -- set count to None (TODO: or raise?) + logger.warning("vocabulary file is incomplete: '%s' is missing", word) + result.vocab[word] = Vocab(index=word_id, count=None) + result.syn0[word_id] = weights + result.index2word.append(word) + + if binary: + binary_len = dtype(REAL).itemsize * vector_size + for line_no in xrange(vocab_size): + # mixed text and binary: read text first, then binary + word = [] + while True: + ch = fin.read(1) + if ch == b' ': + break + if ch != b'\n': # ignore newlines in front of words (some binary files have) + word.append(ch) + word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) + weights = fromstring(fin.read(binary_len), dtype=REAL) + add_word(word, weights) + else: + for line_no, line in enumerate(fin): + parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") + if len(parts) != vector_size + 1: + raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) + word, weights = parts[0], list(map(REAL, parts[1:])) + add_word(word, weights) + if result.syn0.shape[0] != len(result.vocab): + logger.info( + "duplicate words detected, shrinking matrix size from %i to %i", + result.syn0.shape[0], len(result.vocab) + ) + result.syn0 = ascontiguousarray(result.syn0[: len(result.vocab)]) + assert (len(result.vocab), result.vector_size) == result.syn0.shape + + logger.info("loaded %s matrix from %s" % (result.syn0.shape, fname)) + return result + + def intersect_word2vec_format(self, fname, binary=False, encoding='utf8', unicode_errors='strict'): + """ + Merge the input-hidden weight matrix from the original C word2vec-tool format + given, where it intersects with the current vocabulary. (No words are added to the + existing vocabulary, but intersecting words adopt the file's weights, and + non-intersecting words are left alone.) + + `binary` is a boolean indicating whether the data is in binary word2vec format. + """ + overlap_count = 0 + logger.info("loading projection weights from %s" % (fname)) + with utils.smart_open(fname) as fin: + header = utils.to_unicode(fin.readline(), encoding=encoding) + vocab_size, vector_size = map(int, header.split()) # throws for invalid file format + if not vector_size == self.vector_size: + raise ValueError("incompatible vector size %d in file %s" % (vector_size, fname)) + # TOCONSIDER: maybe mismatched vectors still useful enough to merge (truncating/padding)? + if binary: + binary_len = dtype(REAL).itemsize * vector_size + for line_no in xrange(vocab_size): + # mixed text and binary: read text first, then binary + word = [] + while True: + ch = fin.read(1) + if ch == b' ': + break + if ch != b'\n': # ignore newlines in front of words (some binary files have) + word.append(ch) + word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) + weights = fromstring(fin.read(binary_len), dtype=REAL) + if word in self.vocab: + overlap_count += 1 + self.syn0[self.vocab[word].index] = weights + self.syn0_lockf[self.vocab[word].index] = 0.0 # lock it + else: + for line_no, line in enumerate(fin): + parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") + if len(parts) != vector_size + 1: + raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) + word, weights = parts[0], list(map(REAL, parts[1:])) + if word in self.vocab: + overlap_count += 1 + self.syn0[self.vocab[word].index] = weights + logger.info("merged %d vectors into %s matrix from %s" % (overlap_count, self.syn0.shape, fname)) + + def most_similar(self, positive=[], negative=[], topn=10, restrict_vocab=None): + """ + Find the top-N most similar words. Positive words contribute positively towards the + similarity, negative words negatively. + + This method computes cosine similarity between a simple mean of the projection + weight vectors of the given words and the vectors for each word in the model. + The method corresponds to the `word-analogy` and `distance` scripts in the original + word2vec implementation. + + If topn is False, most_similar 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.most_similar(positive=['woman', 'king'], negative=['man']) + [('queen', 0.50882536), ...] + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar('dog'), as a shorthand for most_similar(['dog']) + positive = [positive] + + # add weights for each word, if not already present; default to 1.0 for positive and -1.0 for negative words + positive = [ + (word, 1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in positive + ] + negative = [ + (word, -1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in negative + ] + + # compute the weighted average of all words + all_words, mean = set(), [] + for word, weight in positive + negative: + if isinstance(word, ndarray): + mean.append(weight * word) + elif word in self.vocab: + mean.append(weight * self.syn0norm[self.vocab[word].index]) + all_words.add(self.vocab[word].index) + else: + raise KeyError("word '%s' not in vocabulary" % word) + if not mean: + raise ValueError("cannot compute similarity with no input") + mean = matutils.unitvec(array(mean).mean(axis=0)).astype(REAL) + + limited = self.syn0norm if restrict_vocab is None else self.syn0norm[:restrict_vocab] + dists = dot(limited, mean) + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] + return result[:topn] + + def most_similar_cosmul(self, positive=[], negative=[], topn=10): + """ + Find the top-N most similar words, using the multiplicative combination objective + proposed by Omer Levy and Yoav Goldberg in [4]_. Positive words still contribute + positively towards the similarity, negative words negatively, but with less + susceptibility to one large distance dominating the calculation. + + In the common analogy-solving case, of two positive and one negative examples, + this method is equivalent to the "3CosMul" objective (equation (4)) of Levy and Goldberg. + + Additional positive or negative examples contribute to the numerator or denominator, + respectively – a potentially sensible but untested extension of the method. (With + a single positive example, rankings will be the same as in the default most_similar.) + + Example:: + + >>> trained_model.most_similar_cosmul(positive=['baghdad', 'england'], negative=['london']) + [(u'iraq', 0.8488819003105164), ...] + + .. [4] Omer Levy and Yoav Goldberg. Linguistic Regularities in Sparse and Explicit Word Representations, 2014. + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar_cosmul('dog'), as a shorthand for most_similar_cosmul(['dog']) + positive = [positive] + + all_words = set() + + def word_vec(word): + if isinstance(word, ndarray): + return word + elif word in self.vocab: + all_words.add(self.vocab[word].index) + return self.syn0norm[self.vocab[word].index] + else: + raise KeyError("word '%s' not in vocabulary" % word) + + positive = [word_vec(word) for word in positive] + negative = [word_vec(word) for word in negative] + if not positive: + raise ValueError("cannot compute similarity with no input") + + # equation (4) of Levy & Goldberg "Linguistic Regularities...", + # with distances shifted to [0,1] per footnote (7) + pos_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in positive] + neg_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in negative] + dists = prod(pos_dists, axis=0) / (prod(neg_dists, axis=0) + 0.000001) + + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] + return result[:topn] + + def doesnt_match(self, words): + """ + Which word from the given list doesn't go with the others? + + Example:: + + >>> trained_model.doesnt_match("breakfast cereal dinner lunch".split()) + 'cereal' + + """ + self.init_sims() + + words = [word for word in words if word in self.vocab] # filter out OOV words + logger.debug("using words %s" % words) + if not words: + raise ValueError("cannot select a word from an empty list") + vectors = vstack(self.syn0norm[self.vocab[word].index] for word in words).astype(REAL) + mean = matutils.unitvec(vectors.mean(axis=0)).astype(REAL) + dists = dot(vectors, mean) + return sorted(zip(dists, words))[0][1] + + 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.syn0[self.vocab[words].index] + + return vstack([self.syn0[self.vocab[word].index] for word in words]) + + def __contains__(self, word): + return word in self.vocab + + def similarity(self, w1, w2): + """ + Compute cosine similarity between two words. + + Example:: + + >>> trained_model.similarity('woman', 'man') + 0.73723527 + + >>> trained_model.similarity('woman', 'woman') + 1.0 + + """ + return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2])) + + def n_similarity(self, ws1, ws2): + """ + Compute cosine similarity between two sets of words. + + Example:: + + >>> trained_model.n_similarity(['sushi', 'shop'], ['japanese', 'restaurant']) + 0.61540466561049689 + + >>> trained_model.n_similarity(['restaurant', 'japanese'], ['japanese', 'restaurant']) + 1.0000000000000004 + + >>> trained_model.n_similarity(['sushi'], ['restaurant']) == trained_model.similarity('sushi', 'restaurant') + True + + """ + v1 = [self[word] for word in ws1] + v2 = [self[word] for word in ws2] + return dot(matutils.unitvec(array(v1).mean(axis=0)), matutils.unitvec(array(v2).mean(axis=0))) + + def init_sims(self, replace=False): + """ + Precompute L2-normalized vectors. + + If `replace` is set, forget the original vectors and only keep the normalized + ones = saves lots of memory! + + Note that you **cannot continue training** after doing a replace. The model becomes + effectively read-only = you can call `most_similar`, `similarity` etc., but not `train`. + + """ + if getattr(self, 'syn0norm', None) is None or replace: + logger.info("precomputing L2-norms of word weight vectors") + if replace: + for i in xrange(self.syn0.shape[0]): + self.syn0[i, :] /= sqrt((self.syn0[i, :] ** 2).sum(-1)) + self.syn0norm = self.syn0 + if hasattr(self, 'syn1'): + del self.syn1 + else: + self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL) + + def estimate_memory(self, vocab_size=None, report=None): + """Estimate required memory for a model using current settings and provided vocabulary size.""" + vocab_size = vocab_size or len(self.vocab) + report = report or {} + report['vocab'] = vocab_size * (700 if self.hs else 500) + report['syn0'] = vocab_size * self.vector_size * dtype(REAL).itemsize + if self.hs: + report['syn1'] = vocab_size * self.layer1_size * dtype(REAL).itemsize + if self.negative: + report['syn1neg'] = vocab_size * self.layer1_size * dtype(REAL).itemsize + report['total'] = sum(report.values()) + logger.info("estimated required memory for %i words and %i dimensions: %i bytes", + vocab_size, self.vector_size, report['total']) + return report + + @staticmethod + def log_accuracy(section): + correct, incorrect = len(section['correct']), len(section['incorrect']) + if correct + incorrect > 0: + logger.info("%s: %.1f%% (%i/%i)" % + (section['section'], 100.0 * correct / (correct + incorrect), + correct, correct + incorrect)) + + def accuracy(self, questions, restrict_vocab=30000, most_similar=most_similar): + """ + Compute accuracy of the model. `questions` is a filename where lines are + 4-tuples of words, split into sections by ": SECTION NAME" lines. + See https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt for an example. + + The accuracy is reported (=printed to log and returned as a list) for each + section separately, plus there's one aggregate summary at the end. + + Use `restrict_vocab` to ignore all questions containing a word whose frequency + is not in the top-N most frequent words (default top 30,000). + + This method corresponds to the `compute-accuracy` script of the original C word2vec. + + """ + ok_vocab = dict(sorted(iteritems(self.vocab), + key=lambda item: -item[1].count)[:restrict_vocab]) + ok_index = set(v.index for v in itervalues(ok_vocab)) + + sections, section = [], None + for line_no, line in enumerate(utils.smart_open(questions)): + # TODO: use level3 BLAS (=evaluate multiple questions at once), for speed + line = utils.to_unicode(line) + if line.startswith(': '): + # a new section starts => store the old section + if section: + sections.append(section) + self.log_accuracy(section) + section = {'section': line.lstrip(': ').strip(), 'correct': [], 'incorrect': []} + else: + if not section: + raise ValueError("missing section header before line #%i in %s" % (line_no, questions)) + try: + a, b, c, expected = [word.lower() for word in line.split()] # TODO assumes vocabulary preprocessing uses lowercase, too... + except: + logger.info("skipping invalid line #%i in %s" % (line_no, questions)) + if a not in ok_vocab or b not in ok_vocab or c not in ok_vocab or expected not in ok_vocab: + logger.debug("skipping line #%i with OOV words: %s" % (line_no, line.strip())) + continue + + ignore = set(self.vocab[v].index for v in [a, b, c]) # indexes of words to ignore + predicted = None + # find the most likely prediction, ignoring OOV words and input words + sims = most_similar(self, positive=[b, c], negative=[a], topn=False, restrict_vocab=restrict_vocab) + for index in matutils.argsort(sims, reverse=True): + if index in ok_index and index not in ignore: + predicted = self.index2word[index] + if predicted != expected: + logger.debug("%s: expected %s, predicted %s", line.strip(), expected, predicted) + break + if predicted == expected: + section['correct'].append((a, b, c, expected)) + else: + section['incorrect'].append((a, b, c, expected)) + if section: + # store the last section, too + sections.append(section) + self.log_accuracy(section) + + total = { + 'section': 'total', + 'correct': sum((s['correct'] for s in sections), []), + 'incorrect': sum((s['incorrect'] for s in sections), []), + } + self.log_accuracy(total) + sections.append(total) + return sections + + def __str__(self): + return "%s(vocab=%s, size=%s, alpha=%s)" % (self.__class__.__name__, len(self.index2word), self.vector_size, self.alpha) + + def save(self, *args, **kwargs): + # don't bother storing the cached normalized vectors, recalculable table + kwargs['ignore'] = kwargs.get('ignore', ['syn0norm', 'table', 'cum_table']) + super(Word2Vec, self).save(*args, **kwargs) + + save.__doc__ = utils.SaveLoad.save.__doc__ + + @classmethod + def load(cls, *args, **kwargs): + model = super(Word2Vec, cls).load(*args, **kwargs) + # update older models + if hasattr(model, 'table'): + delattr(model, 'table') # discard in favor of cum_table + if model.negative and hasattr(model, 'index2word'): + model.make_cum_table() # rebuild cum_table from vocabulary + if not hasattr(model, 'corpus_count'): + model.corpus_count = None + for v in model.vocab.values(): + if hasattr(v, 'sample_int'): + break # already 0.12.0+ style int probabilities + elif hasattr(v, 'sample_probability'): + v.sample_int = int(round(v.sample_probability * 2**32)) + del v.sample_probability + if not hasattr(model, 'syn0_lockf') and hasattr(model, 'syn0'): + model.syn0_lockf = ones(len(model.syn0), dtype=REAL) + if not hasattr(model, 'random'): + model.random = random.RandomState(model.seed) + if not hasattr(model, 'train_count'): + model.train_count = 0 + model.total_train_time = 0 + return model + + +class BrownCorpus(object): + """Iterate over sentences from the Brown corpus (part of NLTK data).""" + def __init__(self, dirname): + self.dirname = dirname + + def __iter__(self): + for fname in os.listdir(self.dirname): + fname = os.path.join(self.dirname, fname) + if not os.path.isfile(fname): + continue + for line in utils.smart_open(fname): + line = utils.to_unicode(line) + # each file line is a single sentence in the Brown corpus + # each token is WORD/POS_TAG + token_tags = [t.split('/') for t in line.split() if len(t.split('/')) == 2] + # ignore words with non-alphabetic tags like ",", "!" etc (punctuation, weird stuff) + words = ["%s/%s" % (token.lower(), tag[:2]) for token, tag in token_tags if tag[:2].isalpha()] + if not words: # don't bother sending out empty sentences + continue + yield words + + +class Text8Corpus(object): + """Iterate over sentences from the "text8" corpus, unzipped from http://mattmahoney.net/dc/text8.zip .""" + def __init__(self, fname, max_sentence_length=MAX_WORDS_IN_BATCH): + self.fname = fname + self.max_sentence_length = max_sentence_length + + def __iter__(self): + # the entire corpus is one gigantic line -- there are no sentence marks at all + # so just split the sequence of tokens arbitrarily: 1 sentence = 1000 tokens + sentence, rest = [], b'' + with utils.smart_open(self.fname) as fin: + while True: + text = rest + fin.read(8192) # avoid loading the entire file (=1 line) into RAM + if text == rest: # EOF + sentence.extend(rest.split()) # return the last chunk of words, too (may be shorter/longer) + if sentence: + yield sentence + break + last_token = text.rfind(b' ') # last token may have been split in two... keep for next iteration + words, rest = (utils.to_unicode(text[:last_token]).split(), + text[last_token:].strip()) if last_token >= 0 else ([], text) + sentence.extend(words) + while len(sentence) >= self.max_sentence_length: + yield sentence[:self.max_sentence_length] + sentence = sentence[self.max_sentence_length:] + + +class LineSentence(object): + """ + Simple format: one sentence = one line; words already preprocessed and separated by whitespace. + """ + + def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None): + """ + `source` can be either a string or a file object. Clip the file to the first + `limit` lines (or no clipped if limit is None, the default). + + Example:: + + sentences = LineSentence('myfile.txt') + + Or for compressed files:: + + sentences = LineSentence('compressed_text.txt.bz2') + sentences = LineSentence('compressed_text.txt.gz') + + """ + self.source = source + self.max_sentence_length = max_sentence_length + self.limit = limit + + def __iter__(self): + """Iterate through the lines in the source.""" + try: + # Assume it is a file-like object and try treating it as such + # Things that don't have seek will trigger an exception + self.source.seek(0) + for line in itertools.islice(self.source, self.limit): + line = utils.to_unicode(line).split() + i = 0 + while i < len(line): + yield line[i : i + self.max_sentence_length] + i += self.max_sentence_length + except AttributeError: + # If it didn't work like a file, use it as a string filename + with utils.smart_open(self.source) as fin: + for line in itertools.islice(fin, self.limit): + line = utils.to_unicode(line).split() + i = 0 + while i < len(line): + yield line[i : i + self.max_sentence_length] + i += self.max_sentence_length + + +# Example: ./word2vec.py -train data.txt -output vec.txt -size 200 -window 5 -sample 1e-4 -negative 5 -hs 0 -binary 0 -cbow 1 -iter 3 +if __name__ == "__main__": + import argparse + logging.basicConfig( + format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', + level=logging.INFO) + logging.info("running %s", " ".join(sys.argv)) + logging.info("using optimization %s", FAST_VERSION) + + + # check and process cmdline input + program = os.path.basename(sys.argv[0]) + if len(sys.argv) < 2: + print(globals()['__doc__'] % locals()) + sys.exit(1) + + from gensim.models.word2vec import Word2Vec # avoid referencing __main__ in pickle + + seterr(all='raise') # don't ignore numpy errors + + parser = argparse.ArgumentParser() + parser.add_argument("-train", help="Use text data from file TRAIN to train the model", required=True) + parser.add_argument("-output", help="Use file OUTPUT to save the resulting word vectors") + parser.add_argument("-window", help="Set max skip length WINDOW between words; default is 5", type=int, default=5) + parser.add_argument("-size", help="Set size of word vectors; default is 100", type=int, default=100) + parser.add_argument("-sample", help="Set threshold for occurrence of words. Those that appear with higher frequency in the training data will be randomly down-sampled; default is 1e-3, useful range is (0, 1e-5)", type=float, default=1e-3) + parser.add_argument("-hs", help="Use Hierarchical Softmax; default is 0 (not used)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-negative", help="Number of negative examples; default is 5, common values are 3 - 10 (0 = not used)", type=int, default=5) + parser.add_argument("-threads", help="Use THREADS threads (default 12)", type=int, default=12) + parser.add_argument("-iter", help="Run more training iterations (default 5)", type=int, default=5) + parser.add_argument("-min_count", help="This will discard words that appear less than MIN_COUNT times; default is 5", type=int, default=5) + parser.add_argument("-cbow", help="Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)", type=int, default=1, choices=[0, 1]) + parser.add_argument("-binary", help="Save the resulting vectors in binary mode; default is 0 (off)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-accuracy", help="Use questions from file ACCURACY to evaluate the model") + + args = parser.parse_args() + + if args.cbow == 0: + skipgram = 1 + else: + skipgram = 0 + + corpus = LineSentence(args.train) + + model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window,sample=args.sample,sg=skipgram,hs=args.hs,negative=args.negative,cbow_mean=1,iter=args.iter) + + if args.output: + outfile = args.output + model.save_word2vec_format(outfile, binary=args.binary) + else: + outfile = args.train + model.save(outfile + '.model') + if args.binary == 1: + model.save_word2vec_format(outfile + '.model.bin', binary=True) + else: + model.save_word2vec_format(outfile + '.model.txt', binary=False) + + if args.accuracy: + questions_file = args.accuracy + model.accuracy(questions_file) + + logging.info("finished running %s", program) \ No newline at end of file diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py new file mode 100644 index 0000000000..0d89677eed --- /dev/null +++ b/gensim/test/test_word2vec.py @@ -0,0 +1,422 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2010 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + +""" +Automated tests for checking transformation algorithms (the models package). +""" + + +import logging +import unittest +import os +import tempfile +import itertools +import bz2 + +import numpy + +from gensim import utils, matutils +from gensim.models import word2vec + +module_path = os.path.dirname(__file__) # needed because sample data files are located in the same folder +datapath = lambda fname: os.path.join(module_path, 'test_data', fname) + + +class LeeCorpus(object): + def __iter__(self): + with open(datapath('lee_background.cor')) as f: + for line in f: + yield utils.simple_preprocess(line) + +list_corpus = list(LeeCorpus()) + +sentences = [ + ['human', 'interface', 'computer'], + ['survey', 'user', 'computer', 'system', 'response', 'time'], + ['eps', 'user', 'interface', 'system'], + ['system', 'human', 'system', 'eps'], + ['user', 'response', 'time'], + ['trees'], + ['graph', 'trees'], + ['graph', 'minors', 'trees'], + ['graph', 'minors', 'survey'] +] + +def testfile(): + # temporary data will be stored to this file + return os.path.join(tempfile.gettempdir(), 'gensim_word2vec.tst') + + +def _rule(word, count, min_count): + if word == "human": + return utils.RULE_DISCARD # throw out + else: + return utils.RULE_DEFAULT # apply default rule, i.e. min_count + + +class TestWord2VecModel(unittest.TestCase): + def testPersistence(self): + """Test storing/loading the entire model.""" + model = word2vec.Word2Vec(sentences, min_count=1) + model.save(testfile()) + self.models_equal(model, word2vec.Word2Vec.load(testfile())) + + def testPersistenceWithConstructorRule(self): + """Test storing/loading the entire model with a vocab trimming rule passed in the constructor.""" + model = word2vec.Word2Vec(sentences, min_count=1, trim_rule=_rule) + model.save(testfile()) + self.models_equal(model, word2vec.Word2Vec.load(testfile())) + + def testRuleWithMinCount(self): + """Test that returning RULE_DEFAULT from trim_rule triggers min_count.""" + model = word2vec.Word2Vec(sentences + [["occurs_only_once"]], min_count=2, trim_rule=_rule) + self.assertTrue("human" not in model.vocab) + self.assertTrue("occurs_only_once" not in model.vocab) + self.assertTrue("interface" in model.vocab) + + def testRule(self): + """Test applying vocab trim_rule to build_vocab instead of constructor.""" + model = word2vec.Word2Vec(min_count=1) + model.build_vocab(sentences, trim_rule=_rule) + self.assertTrue("human" not in model.vocab) + + def testLambdaRule(self): + """Test that lambda trim_rule works.""" + rule = lambda word, count, min_count: utils.RULE_DISCARD if word == "human" else utils.RULE_DEFAULT + model = word2vec.Word2Vec(sentences, min_count=1, trim_rule=rule) + self.assertTrue("human" not in model.vocab) + + def testPersistenceWord2VecFormat(self): + """Test storing/loading the entire model in word2vec format.""" + model = word2vec.Word2Vec(sentences, min_count=1) + model.init_sims() + model.save_word2vec_format(testfile(), binary=True) + binary_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True) + binary_model.init_sims(replace=False) + self.assertTrue(numpy.allclose(model['human'], binary_model['human'])) + norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=True) + norm_only_model.init_sims(replace=True) + self.assertFalse(numpy.allclose(model['human'], norm_only_model['human'])) + self.assertTrue(numpy.allclose(model.syn0norm[model.vocab['human'].index], norm_only_model['human'])) + + def testPersistenceWord2VecFormatNonBinary(self): + """Test storing/loading the entire model in word2vec non-binary format.""" + model = word2vec.Word2Vec(sentences, min_count=1) + model.init_sims() + model.save_word2vec_format(testfile(), binary=False) + text_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False) + text_model.init_sims(False) + self.assertTrue(numpy.allclose(model['human'], text_model['human'], atol=1e-6)) + norm_only_model = word2vec.Word2Vec.load_word2vec_format(testfile(), binary=False) + norm_only_model.init_sims(True) + self.assertFalse(numpy.allclose(model['human'], norm_only_model['human'], atol=1e-6)) + + self.assertTrue(numpy.allclose(model.syn0norm[model.vocab['human'].index], norm_only_model['human'], atol=1e-4)) + + def testPersistenceWord2VecFormatWithVocab(self): + """Test storing/loading the entire model and vocabulary in word2vec format.""" + model = word2vec.Word2Vec(sentences, min_count=1) + model.init_sims() + testvocab = os.path.join(tempfile.gettempdir(), 'gensim_word2vec.vocab') + model.save_word2vec_format(testfile(), testvocab, binary=True) + binary_model_with_vocab = word2vec.Word2Vec.load_word2vec_format(testfile(), testvocab, binary=True) + self.assertEqual(model.vocab['human'].count, binary_model_with_vocab.vocab['human'].count) + + def testPersistenceWord2VecFormatCombinationWithStandardPersistence(self): + """Test storing/loading the entire model and vocabulary in word2vec format chained with + saving and loading via `save` and `load` methods`.""" + model = word2vec.Word2Vec(sentences, min_count=1) + model.init_sims() + testvocab = os.path.join(tempfile.gettempdir(), 'gensim_word2vec.vocab') + model.save_word2vec_format(testfile(), testvocab, binary=True) + binary_model_with_vocab = word2vec.Word2Vec.load_word2vec_format(testfile(), testvocab, binary=True) + binary_model_with_vocab.save(testfile()) + binary_model_with_vocab = word2vec.Word2Vec.load(testfile()) + self.assertEqual(model.vocab['human'].count, binary_model_with_vocab.vocab['human'].count) + + def testLargeMmap(self): + """Test storing/loading the entire model.""" + model = word2vec.Word2Vec(sentences, min_count=1) + + # test storing the internal arrays into separate files + model.save(testfile(), sep_limit=0) + self.models_equal(model, word2vec.Word2Vec.load(testfile())) + + # make sure mmaping the arrays back works, too + self.models_equal(model, word2vec.Word2Vec.load(testfile(), mmap='r')) + + def testVocab(self): + """Test word2vec vocabulary building.""" + corpus = LeeCorpus() + total_words = sum(len(sentence) for sentence in corpus) + + # try vocab building explicitly, using all words + model = word2vec.Word2Vec(min_count=1, hs=1, negative=0) + model.build_vocab(corpus) + self.assertTrue(len(model.vocab) == 6981) + # with min_count=1, we're not throwing away anything, so make sure the word counts add up to be the entire corpus + self.assertEqual(sum(v.count for v in model.vocab.values()), total_words) + # make sure the binary codes are correct + numpy.allclose(model.vocab['the'].code, [1, 1, 0, 0]) + + # test building vocab with default params + model = word2vec.Word2Vec(hs=1, negative=0) + model.build_vocab(corpus) + self.assertTrue(len(model.vocab) == 1750) + numpy.allclose(model.vocab['the'].code, [1, 1, 1, 0]) + + # no input => "RuntimeError: you must first build vocabulary before training the model" + self.assertRaises(RuntimeError, word2vec.Word2Vec, []) + + # input not empty, but rather completely filtered out + self.assertRaises(RuntimeError, word2vec.Word2Vec, corpus, min_count=total_words+1) + + def testTraining(self): + """Test word2vec training.""" + # build vocabulary, don't train yet + model = word2vec.Word2Vec(size=2, min_count=1, hs=1, negative=0) + model.build_vocab(sentences) + + self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) + self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + + model.train(sentences) + sims = model.most_similar('graph', topn=10) + # self.assertTrue(sims[0][0] == 'trees', sims) # most similar + + # test querying for "most similar" by vector + graph_vector = model.syn0norm[model.vocab['graph'].index] + sims2 = model.most_similar(positive=[graph_vector], topn=11) + sims2 = [(w, sim) for w, sim in sims2 if w != 'graph'] # ignore 'graph' itself + self.assertEqual(sims, sims2) + + # build vocab and train in one step; must be the same as above + model2 = word2vec.Word2Vec(sentences, size=2, min_count=1, hs=1, negative=0) + self.models_equal(model, model2) + + def testScoring(self): + """Test word2vec scoring.""" + model = word2vec.Word2Vec(sentences, size=2, min_count=1, hs=1, negative=0) + + # just score and make sure they exist + scores = model.score(sentences, len(sentences)) + self.assertEqual(len(scores), len(sentences)) + + def testLocking(self): + """Test word2vec training doesn't change locked vectors.""" + corpus = LeeCorpus() + # build vocabulary, don't train yet + for sg in range(2): # test both cbow and sg + model = word2vec.Word2Vec(size=4, hs=1, negative=5, min_count=1, sg=sg, window=5) + model.build_vocab(corpus) + + # remember two vectors + locked0 = numpy.copy(model.syn0[0]) + unlocked1 = numpy.copy(model.syn0[1]) + # lock the vector in slot 0 against change + model.syn0_lockf[0] = 0.0 + + model.train(corpus) + self.assertFalse((unlocked1 == model.syn0[1]).all()) # unlocked vector should vary + self.assertTrue((locked0 == model.syn0[0]).all()) # locked vector should not vary + + def model_sanity(self, model, train=True): + """Even tiny models trained on LeeCorpus should pass these sanity checks""" + # run extra before/after training tests if train=True + if train: + model.build_vocab(list_corpus) + orig0 = numpy.copy(model.syn0[0]) + model.train(list_corpus) + self.assertFalse((orig0 == model.syn0[1]).all()) # vector should vary after training + sims = model.most_similar('war', topn=len(model.index2word)) + t_rank = [word for word, score in sims].index('terrorism') + # in >200 calibration runs w/ calling parameters, 'terrorism' in 50-most_sim for 'war' + self.assertLess(t_rank, 50) + war_vec = model['war'] + sims2 = model.most_similar([war_vec], topn=51) + self.assertTrue('war' in [word for word, score in sims2]) + self.assertTrue('terrorism' in [word for word, score in sims2]) + + def test_sg_hs(self): + """Test skipgram w/ hierarchical softmax""" + model = word2vec.Word2Vec(sg=1, window=4, hs=1, negative=0, min_count=5, iter=10, workers=2) + self.model_sanity(model) + + def test_sg_neg(self): + """Test skipgram w/ negative sampling""" + model = word2vec.Word2Vec(sg=1, window=4, hs=0, negative=15, min_count=5, iter=10, workers=2) + self.model_sanity(model) + + def test_cbow_hs(self): + """Test CBOW w/ hierarchical softmax""" + model = word2vec.Word2Vec(sg=0, cbow_mean=1, alpha=0.05, window=8, hs=1, negative=0, + min_count=5, iter=10, workers=2, batch_words=1000) + self.model_sanity(model) + + def test_cbow_neg(self): + """Test CBOW w/ negative sampling""" + model = word2vec.Word2Vec(sg=0, cbow_mean=1, alpha=0.05, window=5, hs=0, negative=15, + min_count=5, iter=10, workers=2) + self.model_sanity(model) + + def testTrainingCbow(self): + """Test CBOW word2vec training.""" + # to test training, make the corpus larger by repeating its sentences over and over + # build vocabulary, don't train yet + model = word2vec.Word2Vec(size=2, min_count=1, sg=0, hs=1, negative=0) + model.build_vocab(sentences) + self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) + self.assertTrue(model.syn1.shape == (len(model.vocab), 2)) + + model.train(sentences) + sims = model.most_similar('graph', topn=10) + # self.assertTrue(sims[0][0] == 'trees', sims) # most similar + + # test querying for "most similar" by vector + graph_vector = model.syn0norm[model.vocab['graph'].index] + sims2 = model.most_similar(positive=[graph_vector], topn=11) + sims2 = [(w, sim) for w, sim in sims2 if w != 'graph'] # ignore 'graph' itself + self.assertEqual(sims, sims2) + + # build vocab and train in one step; must be the same as above + model2 = word2vec.Word2Vec(sentences, size=2, min_count=1, sg=0) + self.models_equal(model, model2) + + def testTrainingSgNegative(self): + """Test skip-gram (negative sampling) word2vec training.""" + # to test training, make the corpus larger by repeating its sentences over and over + # build vocabulary, don't train yet + model = word2vec.Word2Vec(size=2, min_count=1, hs=0, negative=2) + model.build_vocab(sentences) + self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) + self.assertTrue(model.syn1neg.shape == (len(model.vocab), 2)) + + model.train(sentences) + sims = model.most_similar('graph', topn=10) + # self.assertTrue(sims[0][0] == 'trees', sims) # most similar + + # test querying for "most similar" by vector + graph_vector = model.syn0norm[model.vocab['graph'].index] + sims2 = model.most_similar(positive=[graph_vector], topn=11) + sims2 = [(w, sim) for w, sim in sims2 if w != 'graph'] # ignore 'graph' itself + self.assertEqual(sims, sims2) + + # build vocab and train in one step; must be the same as above + model2 = word2vec.Word2Vec(sentences, size=2, min_count=1, hs=0, negative=2) + self.models_equal(model, model2) + + def testTrainingCbowNegative(self): + """Test CBOW (negative sampling) word2vec training.""" + # to test training, make the corpus larger by repeating its sentences over and over + # build vocabulary, don't train yet + model = word2vec.Word2Vec(size=2, min_count=1, sg=0, hs=0, negative=2) + model.build_vocab(sentences) + self.assertTrue(model.syn0.shape == (len(model.vocab), 2)) + self.assertTrue(model.syn1neg.shape == (len(model.vocab), 2)) + + model.train(sentences) + sims = model.most_similar('graph', topn=10) + # self.assertTrue(sims[0][0] == 'trees', sims) # most similar + + # test querying for "most similar" by vector + graph_vector = model.syn0norm[model.vocab['graph'].index] + sims2 = model.most_similar(positive=[graph_vector], topn=11) + sims2 = [(w, sim) for w, sim in sims2 if w != 'graph'] # ignore 'graph' itself + self.assertEqual(sims, sims2) + + # build vocab and train in one step; must be the same as above + model2 = word2vec.Word2Vec(sentences, size=2, min_count=1, sg=0, hs=0, negative=2) + self.models_equal(model, model2) + + def testSimilarities(self): + """Test similarity and n_similarity methods.""" + # The model is trained using CBOW + model = word2vec.Word2Vec(size=2, min_count=1, sg=0, hs=0, negative=2) + model.build_vocab(sentences) + model.train(sentences) + + self.assertTrue(model.n_similarity(['graph', 'trees'], ['trees', 'graph'])) + self.assertTrue(model.n_similarity(['graph'], ['trees']) == model.similarity('graph', 'trees')) + + def testParallel(self): + """Test word2vec parallel training.""" + if word2vec.FAST_VERSION < 0: # don't test the plain NumPy version for parallelism (too slow) + return + + corpus = utils.RepeatCorpus(LeeCorpus(), 10000) + + for workers in [2, 4]: + model = word2vec.Word2Vec(corpus, workers=workers) + sims = model.most_similar('israeli') + # the exact vectors and therefore similarities may differ, due to different thread collisions/randomization + # so let's test only for top3 + # TODO: commented out for now; find a more robust way to compare against "gold standard" + # self.assertTrue('palestinian' in [sims[i][0] for i in range(3)]) + + def testRNG(self): + """Test word2vec results identical with identical RNG seed.""" + model = word2vec.Word2Vec(sentences, min_count=2, seed=42, workers=1) + model2 = word2vec.Word2Vec(sentences, min_count=2, seed=42, workers=1) + self.models_equal(model, model2) + + def models_equal(self, model, model2): + self.assertEqual(len(model.vocab), len(model2.vocab)) + self.assertTrue(numpy.allclose(model.syn0, model2.syn0)) + if model.hs: + self.assertTrue(numpy.allclose(model.syn1, model2.syn1)) + if model.negative: + self.assertTrue(numpy.allclose(model.syn1neg, model2.syn1neg)) + most_common_word = max(model.vocab.items(), key=lambda item: item[1].count)[0] + self.assertTrue(numpy.allclose(model[most_common_word], model2[most_common_word])) +#endclass TestWord2VecModel + + def test_sentences_should_not_be_a_generator(self): + """ + Is sentences a generator object? + """ + gen = (s for s in sentences) + self.assertRaises(TypeError, word2vec.Word2Vec, (gen,)) + + +class TestWord2VecSentenceIterators(unittest.TestCase): + def testLineSentenceWorksWithFilename(self): + """Does LineSentence work with a filename argument?""" + with utils.smart_open(datapath('lee_background.cor')) as orig: + sentences = word2vec.LineSentence(datapath('lee_background.cor')) + for words in sentences: + self.assertEqual(words, utils.to_unicode(orig.readline()).split()) + + def testLineSentenceWorksWithCompressedFile(self): + """Does LineSentence work with a compressed file object argument?""" + with utils.smart_open(datapath('head500.noblanks.cor')) as orig: + sentences = word2vec.LineSentence(bz2.BZ2File(datapath('head500.noblanks.cor.bz2'))) + for words in sentences: + self.assertEqual(words, utils.to_unicode(orig.readline()).split()) + + def testLineSentenceWorksWithNormalFile(self): + """Does LineSentence work with a file object argument, rather than filename?""" + with utils.smart_open(datapath('head500.noblanks.cor')) as orig: + with utils.smart_open(datapath('head500.noblanks.cor')) as fin: + sentences = word2vec.LineSentence(fin) + for words in sentences: + self.assertEqual(words, utils.to_unicode(orig.readline()).split()) +#endclass TestWord2VecSentenceIterators + + +if not hasattr(TestWord2VecModel, 'assertLess'): + # workaround for python 2.6 + def assertLess(self, a, b, msg=None): + self.assertTrue(a < b, msg="%s is not less than %s" % (a, b)) + + setattr(TestWord2VecModel, 'assertLess', assertLess) + + +if __name__ == '__main__': + logging.basicConfig( + format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', + level=logging.DEBUG) + logging.info("using optimization %s", word2vec.FAST_VERSION) + unittest.main() From ab25344e4ff522476dff69700bc5841ea7e618b5 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Sat, 16 Jan 2016 02:03:48 +0100 Subject: [PATCH 19/33] Fix for CBOW test. --- gensim/test/test_word2vec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index 0d89677eed..bbf29543f6 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -282,7 +282,7 @@ def testTrainingCbow(self): self.assertEqual(sims, sims2) # build vocab and train in one step; must be the same as above - model2 = word2vec.Word2Vec(sentences, size=2, min_count=1, sg=0) + model2 = word2vec.Word2Vec(sentences, size=2, min_count=1, sg=0, hs=1, negative=0) self.models_equal(model, model2) def testTrainingSgNegative(self): From 2bf45d3f2056c878c269447160757d54042dc4f4 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Sat, 16 Jan 2016 22:50:06 +0100 Subject: [PATCH 20/33] Changelog mention of #538 --- CHANGELOG.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index dd4037d9b8..6b224db8c8 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,13 @@ Changes 0.12.4, XX/XX/XXXX +* Word2vec default values of hyperparameters now are identical to those of original C tool, generally improving performance (Andrey Kutuzov, #538) + - By default use CBOW with negative sampling and the mean of context vectors, instead of skip-gram with hierarchical softmax. + - By default use 3 workers, instead of 1. + - By default use 5 iterations instead of 1. + - By defaut use downsampling with the value 1e-3. + - Additionally, wordvec.py can be now used as a standalone script with command line arguments matching those of original C tool. + (for example, ./word2vec.py -train data.txt -output trained_vec.txt -size 200 -window 2 -sample 1e-4 -negative 10 -hs 0 -binary 0 -iter 3) * load_word2vec_format() performance (@svenkreiss, #555) - Remove `init_sims()` call for performance improvements when normalized vectors are not needed. - Remove `norm_only` parameter (API change). Call `init_sims(replace=True)` after the `load_word2vec_format()` call for the old `norm_only=True` behavior. From 1a579eccc373f86fb9b2997694a2b4d637fedc02 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Sun, 17 Jan 2016 21:48:43 +0100 Subject: [PATCH 21/33] Fix for CBOW negative sampling tests. --- gensim/test/test_word2vec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gensim/test/test_word2vec.py b/gensim/test/test_word2vec.py index bbf29543f6..6d65fbf45d 100644 --- a/gensim/test/test_word2vec.py +++ b/gensim/test/test_word2vec.py @@ -259,7 +259,7 @@ def test_cbow_hs(self): def test_cbow_neg(self): """Test CBOW w/ negative sampling""" model = word2vec.Word2Vec(sg=0, cbow_mean=1, alpha=0.05, window=5, hs=0, negative=15, - min_count=5, iter=10, workers=2) + min_count=5, iter=10, workers=2, sample=0) self.model_sanity(model) def testTrainingCbow(self): From 0c10fa6c742a4ceee1af410405a625c6ad3c0dbc Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 26 Jan 2016 16:36:09 +0100 Subject: [PATCH 22/33] Factoring out word2vec _main__ into gensim/scripts --- gensim/scripts/word2vec_standalone.py | 118 ++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100755 gensim/scripts/word2vec_standalone.py diff --git a/gensim/scripts/word2vec_standalone.py b/gensim/scripts/word2vec_standalone.py new file mode 100755 index 0000000000..8fca816449 --- /dev/null +++ b/gensim/scripts/word2vec_standalone.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + + +""" +USAGE: %(program)s -train CORPUS -output VECTORS -size SIZE -window WINDOW +-cbow CBOW -sample SAMPLE -hs HS -negative NEGATIVE -threads THREADS -iter ITER +-min-count MIN-COUNT -binary BINARY -accuracy FILE + +Trains a neural embedding model on text file CORPUS. +Parameters essentially reproduce those used by the original C tool +(see https://code.google.com/archive/p/word2vec/). + +Parameters for training: + -train + Use text data from to train the model + -output + Use to save the resulting word vectors / word clusters + -size + Set size of word vectors; default is 100 + -window + Set max skip length between words; default is 5 + -sample + Set threshold for occurrence of words. Those that appear with higher frequency in the training data + will be randomly down-sampled; default is 1e-3, useful range is (0, 1e-5) + -hs + Use Hierarchical Softmax; default is 0 (not used) + -negative + Number of negative examples; default is 5, common values are 3 - 10 (0 = not used) + -threads + Use threads (default 3) + -iter + Run more training iterations (default 5) + -min-count + This will discard words that appear less than times; default is 5 + -binary + Save the resulting vectors in binary moded; default is 0 (off) + -cbow + Use the continuous bag of words model; default is 1 (use 0 for skip-gram model) + -accuracy + Compute accuracy of the resulting model analogical inference power on questions file + See an example of questions file at https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt + +Example: python -m gensim.scripts.word2vec_standalone -train data.txt -output vec.txt -size 200 -sample 1e-4 -binary 0 -iter 3 +""" + + +import logging +import os.path +import sys +import argparse + +if __name__ == "__main__": + from gensim.models.word2vec import Word2Vec # avoid referencing __main__ in pickle + from gensim.models.word2vec_inner import FAST_VERSION + logging.basicConfig( + format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', + level=logging.INFO) + logging.info("running %s", " ".join(sys.argv)) + logging.info("using optimization %s", FAST_VERSION) + + + # check and process cmdline input + program = os.path.basename(sys.argv[0]) + if len(sys.argv) < 2: + print(globals()['__doc__'] % locals()) + sys.exit(1) + + + + seterr(all='raise') # don't ignore numpy errors + + parser = argparse.ArgumentParser() + parser.add_argument("-train", help="Use text data from file TRAIN to train the model", required=True) + parser.add_argument("-output", help="Use file OUTPUT to save the resulting word vectors") + parser.add_argument("-window", help="Set max skip length WINDOW between words; default is 5", type=int, default=5) + parser.add_argument("-size", help="Set size of word vectors; default is 100", type=int, default=100) + parser.add_argument("-sample", help="""Set threshold for occurrence of words. Those that appear with higher frequency in the training data will be randomly down-sampled; + default is 1e-3, useful range is (0, 1e-5)""", type=float, default=1e-3) + parser.add_argument("-hs", help="Use Hierarchical Softmax; default is 0 (not used)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-negative", help="Number of negative examples; default is 5, common values are 3 - 10 (0 = not used)", type=int, default=5) + parser.add_argument("-threads", help="Use THREADS threads (default 3)", type=int, default=3) + parser.add_argument("-iter", help="Run more training iterations (default 5)", type=int, default=5) + parser.add_argument("-min_count", help="This will discard words that appear less than MIN_COUNT times; default is 5", type=int, default=5) + parser.add_argument("-cbow", help="Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)", type=int, default=1, choices=[0, 1]) + parser.add_argument("-binary", help="Save the resulting vectors in binary mode; default is 0 (off)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-accuracy", help="Use questions from file ACCURACY to evaluate the model") + + args = parser.parse_args() + + if args.cbow == 0: + skipgram = 1 + else: + skipgram = 0 + + corpus = LineSentence(args.train) + + model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window, \ + sample=args.sample,sg=skipgram,hs=args.hs,negative=args.negative,cbow_mean=1,iter=args.iter) + + if args.output: + outfile = args.output + model.save_word2vec_format(outfile, binary=args.binary) + else: + outfile = args.train + model.save(outfile + '.model') + if args.binary == 1: + model.save_word2vec_format(outfile + '.model.bin', binary=True) + else: + model.save_word2vec_format(outfile + '.model.txt', binary=False) + + if args.accuracy: + questions_file = args.accuracy + model.accuracy(questions_file) + + logging.info("finished running %s", program) From 8a3d58bb87933f1acc8ed514f2f62da2e3087158 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 27 Jan 2016 17:30:08 +0100 Subject: [PATCH 23/33] Use logger instead of logging. --- gensim/scripts/word2vec_standalone.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/gensim/scripts/word2vec_standalone.py b/gensim/scripts/word2vec_standalone.py index 8fca816449..78db8b7b06 100755 --- a/gensim/scripts/word2vec_standalone.py +++ b/gensim/scripts/word2vec_standalone.py @@ -7,7 +7,7 @@ """ USAGE: %(program)s -train CORPUS -output VECTORS -size SIZE -window WINDOW -cbow CBOW -sample SAMPLE -hs HS -negative NEGATIVE -threads THREADS -iter ITER --min-count MIN-COUNT -binary BINARY -accuracy FILE +-min_count MIN-COUNT -binary BINARY -accuracy FILE Trains a neural embedding model on text file CORPUS. Parameters essentially reproduce those used by the original C tool @@ -33,7 +33,7 @@ Use threads (default 3) -iter Run more training iterations (default 5) - -min-count + -min_count This will discard words that appear less than times; default is 5 -binary Save the resulting vectors in binary moded; default is 0 (off) @@ -52,14 +52,20 @@ import sys import argparse + +logger = logging.getLogger(__name__) + if __name__ == "__main__": from gensim.models.word2vec import Word2Vec # avoid referencing __main__ in pickle from gensim.models.word2vec_inner import FAST_VERSION + from gensim.models.word2vec import LineSentence + from numpy import seterr + logging.basicConfig( format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', level=logging.INFO) - logging.info("running %s", " ".join(sys.argv)) - logging.info("using optimization %s", FAST_VERSION) + logger.info("running %s", " ".join(sys.argv)) + logger.info("using optimization %s", FAST_VERSION) # check and process cmdline input @@ -115,4 +121,4 @@ questions_file = args.accuracy model.accuracy(questions_file) - logging.info("finished running %s", program) + logger.info("finished running %s", program) From c5249b9f466595c68431b813dd8fcda10177ca0c Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 27 Jan 2016 17:43:13 +0100 Subject: [PATCH 24/33] Made Changelog less verbose about word2vec defaults changed. --- CHANGELOG.txt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index b071f43db0..2d3d3528ae 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,12 +4,9 @@ Changes 0.12.4, XX/XX/XXXX * Word2vec default values of hyperparameters now are identical to those of original C tool, generally improving performance (Andrey Kutuzov, #538) - - By default use CBOW with negative sampling and the mean of context vectors, instead of skip-gram with hierarchical softmax. - - By default use 3 workers, instead of 1. - - By default use 5 iterations instead of 1. - - By defaut use downsampling with the value 1e-3. - - Additionally, wordvec.py can be now used as a standalone script with command line arguments matching those of original C tool. - (for example, ./word2vec.py -train data.txt -output trained_vec.txt -size 200 -window 2 -sample 1e-4 -negative 10 -hs 0 -binary 0 -iter 3) + See https://github.com/akutuzov/gensim/commit/6456cbcd75e6f8720451766ba31cc046b4463ae2 for diff between old and new defaults. + - Additionally, scripts/wordvec_standalone.py can be now used as a standalone script with command line arguments matching those of original C tool. + (for example, ./word2vec_standalone.py -train data.txt -output trained_vec.txt -size 200 -window 2 -sample 1e-4 -negative 10 -hs 0 -binary 0 -iter 3) * load_word2vec_format() performance (@svenkreiss, #555) - Remove `init_sims()` call for performance improvements when normalized vectors are not needed. - Remove `norm_only` parameter (API change). Call `init_sims(replace=True)` after the `load_word2vec_format()` call for the old `norm_only=True` behavior. From a40e624fb8775a1f2db2fe667fc05f4532dbae6a Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 27 Jan 2016 18:18:39 +0100 Subject: [PATCH 25/33] Fixes to word2vec_standalone.py as per Radim's comments. --- gensim/scripts/word2vec_standalone.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/gensim/scripts/word2vec_standalone.py b/gensim/scripts/word2vec_standalone.py index 78db8b7b06..c8bd3c8804 100755 --- a/gensim/scripts/word2vec_standalone.py +++ b/gensim/scripts/word2vec_standalone.py @@ -74,8 +74,6 @@ print(globals()['__doc__'] % locals()) sys.exit(1) - - seterr(all='raise') # don't ignore numpy errors parser = argparse.ArgumentParser() @@ -103,19 +101,19 @@ corpus = LineSentence(args.train) - model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window, \ - sample=args.sample,sg=skipgram,hs=args.hs,negative=args.negative,cbow_mean=1,iter=args.iter) + model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window, + sample=args.sample, sg=skipgram, hs=args.hs, negative=args.negative, cbow_mean=1, iter=args.iter) if args.output: outfile = args.output model.save_word2vec_format(outfile, binary=args.binary) else: - outfile = args.train + outfile = args.train.split('.')[0] model.save(outfile + '.model') - if args.binary == 1: - model.save_word2vec_format(outfile + '.model.bin', binary=True) - else: - model.save_word2vec_format(outfile + '.model.txt', binary=False) + if args.binary == 1: + model.save_word2vec_format(outfile + '.model.bin', binary=True) + else: + model.save_word2vec_format(outfile + '.model.txt', binary=False) if args.accuracy: questions_file = args.accuracy From dbd0eabfe3690862eccf841b83fbf8289546749b Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 27 Jan 2016 18:43:57 +0100 Subject: [PATCH 26/33] Alpha argument. with different defaults for CBOW ans skipgram. --- gensim/scripts/word2vec_standalone.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gensim/scripts/word2vec_standalone.py b/gensim/scripts/word2vec_standalone.py index c8bd3c8804..8740b0a78d 100755 --- a/gensim/scripts/word2vec_standalone.py +++ b/gensim/scripts/word2vec_standalone.py @@ -7,7 +7,7 @@ """ USAGE: %(program)s -train CORPUS -output VECTORS -size SIZE -window WINDOW -cbow CBOW -sample SAMPLE -hs HS -negative NEGATIVE -threads THREADS -iter ITER --min_count MIN-COUNT -binary BINARY -accuracy FILE +-min_count MIN-COUNT -alpha ALPHA -binary BINARY -accuracy FILE Trains a neural embedding model on text file CORPUS. Parameters essentially reproduce those used by the original C tool @@ -35,6 +35,8 @@ Run more training iterations (default 5) -min_count This will discard words that appear less than times; default is 5 + -alpha + Set the starting learning rate; default is 0.025 for skip-gram and 0.05 for CBOW -binary Save the resulting vectors in binary moded; default is 0 (off) -cbow @@ -88,6 +90,7 @@ parser.add_argument("-threads", help="Use THREADS threads (default 3)", type=int, default=3) parser.add_argument("-iter", help="Run more training iterations (default 5)", type=int, default=5) parser.add_argument("-min_count", help="This will discard words that appear less than MIN_COUNT times; default is 5", type=int, default=5) + parser.add_argument("-alpha", help="Set the starting learning rate; default is 0.025 for skip-gram and 0.05 for CBOW", type=float) parser.add_argument("-cbow", help="Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)", type=int, default=1, choices=[0, 1]) parser.add_argument("-binary", help="Save the resulting vectors in binary mode; default is 0 (off)", type=int, default=0, choices=[0, 1]) parser.add_argument("-accuracy", help="Use questions from file ACCURACY to evaluate the model") @@ -96,13 +99,17 @@ if args.cbow == 0: skipgram = 1 + if not args.alpha: + args.alpha = 0.025 else: skipgram = 0 + if not args.alpha: + args.alpha = 0.05 corpus = LineSentence(args.train) model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window, - sample=args.sample, sg=skipgram, hs=args.hs, negative=args.negative, cbow_mean=1, iter=args.iter) + sample=args.sample, alpha=args.alpha, sg=skipgram, hs=args.hs, negative=args.negative, cbow_mean=1, iter=args.iter) if args.output: outfile = args.output From 9c74b408fd62a7d753bd745c96bf78f82f14768d Mon Sep 17 00:00:00 2001 From: Lev Konstantinovskiy Date: Thu, 9 Jun 2016 19:48:42 -0700 Subject: [PATCH 27/33] Release version typo fix --- CHANGELOG.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index b1f17367a6..60c22a4845 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,6 @@ Changes ======= -0.12.5, 2016 +0.13.0, 2016 * Tutorials migrated from website to ipynb (@j9chan, #721), (@jesford, #733), (@jesford, #725), (@jesford, #716) * New doc2vec intro tutorial (@seanlaw, #730) * Gensim Quick Start Tutorial (@andrewjlm, #727) From b8b30c2a24bed3b4d5c8e6ae6622897fd770b9ec Mon Sep 17 00:00:00 2001 From: akutuzov Date: Sat, 2 Jul 2016 21:59:47 +0200 Subject: [PATCH 28/33] Finalizing. --- CHANGELOG.md | 444 +++++++++ README.md | 156 ++++ README.rst | 104 --- gensim/models/word2vec.py | 1831 +++++++++++++++++++++++++++++++++++++ tutorials.md | 96 ++ 5 files changed, 2527 insertions(+), 104 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 README.md delete mode 100644 README.rst create mode 100644 gensim/models/word2vec.py create mode 100644 tutorials.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..30c025f67b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,444 @@ +Changes +======= +0.13.2 + +* topics, topn parameters changed to num_topics and num_words in show_topics() and print_topics()(@droudy, #747) + - In hdpmodel and dtmmodel + - NOT BACKWARDS COMPATIBLE! +* Added random_state parameter to LdaState initializer and check_random_state() (@droudy, #113) +* Implemented LsiModel.docs_processed attribute + +0.13.1, 2016-06-22 + +* Topic coherence C_v and U_mass (@dsquareindia, #710) + +0.13.0, 2016-06-21 + +* Added Distance Metrics to matutils.pt (@bhargavvader, #656) +* Tutorials migrated from website to ipynb (@j9chan, #721), (@jesford, #733), (@jesford, #725), (@jesford, #716) +* New doc2vec intro tutorial (@seanlaw, #730) +* Gensim Quick Start Tutorial (@andrewjlm, #727) +* Add export_phrases(sentences) to model Phrases (hanabi1224 #588) +* SparseMatrixSimilarity returns a sparse matrix if `maintain_sparsity` is True (@davechallis, #590) +* added functionality for Topics of Words in document - i.e, dynamic topics. (@bhargavvader, #704) + - also included tutorial which explains new functionalities, and document word-topic colring. +* Made normalization an explicit transformation. Added 'l1' norm support (@squareindia, #649) +* added term-topics API for most probable topic for word in vocab. (@bhargavvader, #706) +* build_vocab takes progress_per parameter for smaller output (@zer0n, #624) +* Control whether to use lowercase for computing word2vec accuracy. (@alantian, #607) +* Easy import of GloVe vectors using Gensim (Manas Ranjan Kar, #625) + - Allow easy port of GloVe vectors into Gensim + - Standalone script with command line arguments, compatible with Python>=2.6 + - Usage: python -m gensim.scripts.glove2word2vec -i glove_vectors.txt -o output_word2vec_compatible.txt +* Add `similar_by_word()` and `similar_by_vector()` to word2vec (@isohyt, #381) +* Convenience method for similarity of two out of training sentences to doc2vec (@ellolo, #707) +* Dynamic Topic Modelling Tutorial updated with Dynamic Influence Model (@bhargavvader, #689) +* Added function to filter 'n' most frequent words from the dictionary (@abhinavchawla, #718) +* Raise warnings if vocab is single character elements and if alpha is increased in word2vec/doc2vec (@dsquareindia, #705) +* Tests for wikidump (@jonmcoe, #723) +* Mallet wrapper sparse format support (@RishabGoel, #664) +* Doc2vec pre-processing script translated from bash to Python (@andrewjlm, #720) + + +0.12.4, 2016-01-29 + +* Better internal handling of job batching in word2vec (#535) + - up to 300% speed up when training on very short documents (~tweets) +* Word2vec CLI in line with original word2vec.c (Andrey Kutuzov, #538) + - Same default values. See diff https://github.com/akutuzov/gensim/commit/6456cbcd75e6f8720451766ba31cc046b4463ae2 + - Standalone script with command line arguments matching those of original C tool. + - Usage: python -m gensim.scripts.word2vec_standalone -train data.txt -output trained_vec.txt -size 200 -window 2 -sample 1e-4 +* Improved load_word2vec_format() performance (@svenkreiss, #555) + - Remove `init_sims()` call for performance improvements when normalized vectors are not needed. + - Remove `norm_only` parameter (API change). Call `init_sims(replace=True)` after the `load_word2vec_format()` call for the old `norm_only=True` behavior. +* Word2vec allows non-strict unicode error handling (ignore or replace) (Gordon Mohr, #466) +* Doc2Vec `model.docvecs[key]` now raises KeyError for unknown keys (Gordon Mohr, #520) +* Fix `DocvecsArray.index_to_doctag` so `most_similar()` returns string doctags (Gordon Mohr, #560) +* On-demand loading of the `pattern` library in utils.lemmatize (Jan Zikes, #461) + - `utils.HAS_PATTERN` flag moved to `utils.has_pattern()` +* Threadsafe Word2Vec/Doc2Vec finish-check to avoid hang/unending Word2Vec/Doc2Vec training (Gordon Mohr, #571) +* Tuned `TestWord2VecModel.test_cbow_hs()` against random failures (Gordon Mohr, #531) +* Prevent ZeroDivisionError when `default_timer()` indicate no elapsed time (Gordon Mohr, #518) +* Forwards compatibility for NumPy > 1.10 (Matti Lyra, #494, #513) + - LdaModel and LdaMulticore produce a large number of DeprecationWarnings from + .inference() because the term ids in each chunk returned from utils.grouper + are floats. This behaviour has been changed so that the term IDs are now ints. + - utils.grouper returns a python list instead of a numpy array in .update() when + LdaModel is called in non distributed mode + - in distributed mode .update() will still call utils.grouper with as_numpy=True + to save memory + - LdaModel.update and LdaMulticore.update have a new keyword parameter + chunks_as_numpy=True/False (defaults to False) that allows controlling + this behaviour + +0.12.3, 2015-11-05 + +* Make show_topics return value consistent across models (Christopher Corley, #448) + - All models with the `show_topics` method should return a list of + `(topic_number, topic)` tuples, where `topic` is a list of + `(word, probability)` tuples. + - This is a breaking change that affects users of the `LsiModel`, `LdaModel`, + and `LdaMulticore` that may be reliant on the old tuple layout of + `(probability, word)`. +* Mixed integer & string document-tags (keys to doc-vectors) will work (Gordon Mohr, #491) + - DocvecsArray's `index2doctag` list is renamed/reinterpreted as `offset2doctag` + - `offset2doctag` entries map to `doctag_syn0` indexes *after* last plain-int doctag (if any) + - (If using only string doctags, `offset2doctag` may be interpreted same as `index2doctag`.) +* New Tutorials on Dynamic Topic Modelling and Classification via Word2Vec (@arttii #471, @mataddy #500) +* Auto-learning for the eta parameter on the LdaModel (Christopher Corley, #479) +* Python 3.5 support +* Speed improvements to keyword and summarisation methods (@erbas #441) +* OSX wheels (#504) +* Win build (#492) + +0.12.2, 2015-09-19 + +* tutorial on text summarization (Ólavur Mortensen, #436) +* more flexible vocabulary construction in word2vec & doc2vec (Philipp Dowling, #434) +* added support for sliced TransformedCorpus objects, so that after applying (for instance) TfidfModel the returned corpus remains randomly indexable. (Matti Lyra, #425) +* changed the LdaModel.save so that a custom `ignore` list can be passed in (Matti Lyra, #331) +* added support for NumPy style fancy indexing to corpus objects (Matti Lyra, #414) +* py3k fix in distributed LSI (spacecowboy, #433) +* Windows fix for setup.py (#428) +* fix compatibility for scipy 0.16.0 (#415) + +0.12.1, 2015-07-20 + +* improvements to testing, switch to Travis CI containers +* support for loading old word2vec models (<=0.11.1) in 0.12+ (Gordon Mohr, #405) +* various bug fixes to word2vec, doc2vec (Gordon Mohr, #393, #386, #404) +* TextSummatization support for very short texts (Federico Barrios, #390) +* support for word2vec[['word1', 'word2'...]] convenience API calls (Satish Palaniappan, #395) +* MatrixSimilarity supports indexing generator corpora (single pass) + +0.12.0, 2015-07-06 + +* complete API, performance, memory overhaul of doc2vec (Gordon Mohr, #356, #373, #380, #384) + - fast infer_vector(); optional memory-mapped doc vectors; memory savings with int doc IDs + - 'dbow_words' for combined DBOW & word skip-gram training; new 'dm_concat' mode + - multithreading & negative-sampling optimizations (also benefitting word2vec) + - API NOTE: doc vectors must now be accessed/compared through model's 'docvecs' field + (eg: "model.docvecs['my_ID']" or "model.docvecs.most_similar('my_ID')") + - https://github.com/piskvorky/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb +* new "text summarization" module (PR #324: Federico Lopez, Federico Barrios) + - https://github.com/summanlp/docs/raw/master/articulo/articulo-en.pdf +* new matutils.argsort with partial sort + - performance speedups to all similarity queries (word2vec, Similarity classes...) +* word2vec can compute likelihood scores for classification (Mat Addy, #358) + - http://arxiv.org/abs/1504.07295 + - http://nbviewer.ipython.org/github/taddylab/deepir/blob/master/w2v-inversion.ipynb +* word2vec supports "encoding" parameter when loading from C format, for non-utf8 models +* more memory-efficient word2vec training (#385) +* fixes to Python3 compatibility (Pavel Kalaidin #330, S-Eugene #369) +* enhancements to save/load format (Liang Bo Wang #363, Gordon Mohr #356) + - pickle defaults to protocol=2 for better py3 compatibility +* fixes and improvements to wiki parsing (Lukas Elmer #357, Excellent5 #333) +* fix to phrases scoring (Ikuya Yamada, #353) +* speed up of phrases generation (Dave Challis, #349) +* changes to multipass LDA training (Christopher Corley, #298) +* various doc improvements and fixes (Matti Lyra #331, Hongjoo Lee #334) +* fixes and improvements to LDA (Christopher Corley #323) + +0.11.0 = 0.11.1 = 0.11.1-1, 2015-04-10 + +* added "topic ranking" to sort topics by coherence in LdaModel (jtmcmc, #311) +* new fast ShardedCorpus out-of-core corpus (Jan Hajic jr., #284) +* utils.smart_open now uses the smart_open package (#316) +* new wrapper for LDA in Vowpal Wabbit (Dave Challis, #304) +* improvements to the DtmModel wrapper (Yang Han, #272, #277) +* move wrappers for external modeling programs into a submodule (Christopher Corley, #295) +* allow transparent compression of NumPy files in save/load (Christopher Corley, #248) +* save/load methods now accept file handles, in addition to file names (macks22, #292) +* fixes to LdaMulticore on Windows (Feng Mai, #305) +* lots of small fixes & py3k compatibility improvements (Chyi-Kwei Yau, Daniel Nouri, Timothy Emerick, Juarez Bochi, Christopher Corley, Chirag Nagpal, Jan Hajic jr., Flávio Codeço Coelho) +* re-released as 0.11.1 and 0.11.1-1 because of a packaging bug + +0.10.3, 2014-11-17 + +* added streamed phrases = collocation detection (Miguel Cabrera, #258) +* added param for multiple word2vec epochs (sebastienj, #243) +* added doc2vec (=paragraph2vec = extension of word2vec) model (Timothy Emerick, #231) +* initialize word2vec deterministically, for increased experiment reproducibility (KCzar, #240) +* all indexed corpora now allow full Python slicing syntax (Christopher Corley, #246) +* update distributed code for new Pyro4 API and py3k (Michael Brooks, Marco Bonzanini, #255, #249) +* fixes to six module version (Lars Buitinck, #259) +* fixes to setup.py (Maxim Avanov and Christopher Corley, #260, #251) +* ...and lots of minor fixes & updates all around + +0.10.2, 2014-09-18 + +* new parallelized, LdaMulticore implementation (Jan Zikes, #232) +* Dynamic Topic Models (DTM) wrapper (Arttii, #205) +* word2vec compiled from bundled C file at install time: no more pyximport (#233) +* standardize show_/print_topics in LdaMallet (Benjamin Bray, #223) +* add new word2vec multiplicative objective (3CosMul) of Levy & Goldberg (Gordon Mohr, #224) +* preserve case in MALLET wrapper (mcburton, #222) +* support for matrix-valued topic/word prior eta in LdaModel (mjwillson, #208) +* py3k fix to SparseCorpus (Andreas Madsen, #234) +* fix to LowCorpus when switching dictionaries (Christopher Corley, #237) + +0.10.1, 2014-07-22 + +* word2vec: new n_similarity method for comparing two sets of words (François Scharffe, #219) +* make LDA print/show topics parameters consistent with LSI (Bram Vandekerckhove, #201) +* add option for efficient word2vec subsampling (Gordon Mohr, #206) +* fix length calculation for corpora on empty files (Christopher Corley, #209) +* improve file cleanup of unit tests (Christopher Corley) +* more unit tests +* unicode now stored everywhere in gensim internally; accepted input stays either utf8 or unicode +* various fixes to the py3k ported code +* allow any dict-like input in Dictionary.from_corpus (Andreas Madsen) +* error checking improvements to the MALLET wrapper +* ignore non-articles during wiki parsig +* utils.lemmatize now (optionally) ignores stopwords + +0.10.0 (aka "PY3K port"), 2014-06-04 + +* full Python 3 support (targeting 3.3+, #196) +* all internal methods now expect & store unicode, instead of utf8 +* new optimized word2vec functionality: negative sampling, cbow (sebastien-j, #162) +* allow by-frequency sort in Dictionary.save_as_text (Renaud Richardet, #192) +* add topic printing to HDP model (Tiepes, #190) +* new gensim_addons package = optional install-time Cython compilations (Björn Esser, #197) +* added py3.3 and 3.4 to Travis CI tests +* fix a cbow word2vec bug (Liang-Chi Hsieh) + +0.9.1, 2014-04-12 + +* MmCorpus fix for Windows +* LdaMallet support for printing/showing topics +* fix LdaMallet bug when user specified a file prefix (Victor, #184) +* fix LdaMallet output when input is single vector (Suvir) +* added LdaMallet unit tests +* more py3k fixes (Lars Buitinck) +* change order of LDA topic printing (Fayimora Femi-Balogun, #188) + +0.9.0, 2014-03-16 + +* save/load automatically single out large arrays + allow mmap +* allow .gz/.bz2 corpus filenames => transparently (de)compressed I/O +* CBOW model for word2vec (Sébastien Jean, #176) +* new API for storing corpus metadata (Joseph Chang, #169) +* new LdaMallet class = train LDA using wrapped Mallet +* new MalletCorpus class for corpora in Mallet format (Christopher Corley, #179) +* better Wikipedia article parsing (Joseph Chang, #170) +* word2vec load_word2vec_format uses less memory (Yves Raimond, #164) +* load/store vocabulary files for word2vec C format (Yves Raimond, #172) +* HDP estimation on new documents (Elliot Kulakow, #153) +* store labels in SvmLight corpus (Ritesh, #152) +* fix word2vec binary load on Windows (Stephanus van Schalkwyk) +* replace numpy.svd with scipy.svd for more stability (Sven Döring, #159) +* parametrize LDA constructor (Christopher Corley, #174) +* steps toward py3k compatibility (Lars Buitinck, #154) + +0.8.9, 2013-12-26 + +* use travis-ci for continuous integration +* auto-optimize LDA asymmetric prior (Ben Trahan) +* update for new word2vec binary format (Daren Race) +* doc rendering fix (Dan Foreman-Mackey) +* better LDA perplexity logging +* fix Pyro thread leak in distributed algos (Brian Feeny) +* optimizations in word2vec (Bryan Rink) +* allow compressed input in LineSentence corpus (Eric Moyer) +* upgrade ez_setup, doc improvements, minor fixes etc. + +0.8.8 (aka "word2vec release"), 2013-11-03 + +* python3 port by Parikshit Samant: https://github.com/samantp/gensimPy3 +* massive optimizations to word2vec (cython, BLAS, multithreading): ~20x-300x speedup +* new word2vec functionality (thx to Ghassen Hamrouni, PR #124) +* new CSV corpus class (thx to Zygmunt Zając) +* corpus serialization checks to prevent overwriting (by Ian Langmore, PR #125) +* add context manager support for older Python<=2.6 for gzip and bz2 +* added unittests for word2vec + +0.8.7, 2013-09-18 + +* initial version of word2vec, a neural network deep learning algo +* make distributed gensim compatible with the new Pyro +* allow merging dictionaries (by Florent Chandelier) +* new design for the gensim website! +* speed up handling of corner cases when returning top-n most similar +* make Random Projections compatible with new scipy (andrewjOc360, PR #110) +* allow "light" (faster) word lemmatization (by Karsten Jeschkies) +* save/load directly from bzip2 files (by Luis Pedro Coelho, PR #101) +* Blei corpus now tries harder to find its vocabulary file (by Luis Pedro Coelho, PR #100) +* sparse vector elements can now be a list (was: only a 2-tuple) +* simple_preprocess now optionally deaccents letters (ř/š/ú=>r/s/u etc.) +* better serialization of numpy corpora +* print_topics() returns the topics, in addition to printing/logging +* fixes for more robust Windows multiprocessing +* lots of small fixes, data checks and documentation updates + +0.8.6, 2012-09-15 + +* added HashDictionary (by Homer Strong) +* support for adding target classes in SVMlight format (by Corrado Monti) +* fixed problems with global lemmatizer object when running in parallel on Windows +* parallelization of Wikipedia processing + added script version that lemmatizes the input documents +* added class method to initialize Dictionary from an existing corpus (by Marko Burjek) + +0.8.5, 2012-07-22 + +* improved performance of sharding (similarity queries) +* better Wikipedia parsing (thx to Alejandro Weinstein and Lars Buitinck) +* faster Porter stemmer (thx to Lars Buitinck) +* several minor fixes (in HDP model thx to Greg Ver Steeg) +* improvements to documentation + +0.8.4, 2012-03-09 + +* better support for Pandas series input (thx to JT Bates) +* a new corpus format: UCI bag-of-words (thx to Jonathan Esterhazy) +* a new model, non-parametric bayes: HDP (thx to Jonathan Esterhazy; based on Chong Wang's code) +* improved support for new scipy versions (thx to Skipper Seabold) +* lemmatizer support for wikipedia parsing (via the `pattern` python package) +* extended the lemmatizer for multi-core processing, to improve its performance + +0.8.3, 2011-12-02 + +* fixed Similarity sharding bug (issue #65, thx to Paul Rudin) +* improved LDA code (clarity & memory footprint) +* optimized efficiency of Similarity sharding + +0.8.2, 2011-10-31 + +* improved gensim landing page +* improved accuracy of SVD (Latent Semantic Analysis) (thx to Mark Tygert) +* changed interpretation of LDA topics: github issue #57 +* took out similarity server code introduced in 0.8.1 (will become a separate project) +* started using `tox` for testing +* + several smaller fixes and optimizations + +0.8.1, 2011-10-10 + +* transactional similarity server: see docs/simserver.html +* website moved from university hosting to radimrehurek.com +* much improved speed of lsi[corpus] transformation: +* accuracy tests of incremental svd: test/svd_error.py and http://groups.google.com/group/gensim/browse_thread/thread/4b605b72f8062770 +* further improvements to memory-efficiency of LDA and LSA +* improved wiki preprocessing (thx to Luca de Alfaro) +* model.print_topics() debug fncs now support std output, in addition to logging (thx to Homer Strong) +* several smaller fixes and improvements + +0.8.0 (Armageddon), 2011-06-28 + +* changed all variable and function names to comply with PEP8 (numTopics->num_topics): BREAKS BACKWARD COMPATIBILITY! +* added support for similarity querying more documents at once (index[query_documents] in addition to index[query_document]; much faster) +* rewrote Similarity so that it is more efficient and scalable (using disk-based mmap'ed shards) +* simplified directory structure (src/gensim/ is now only gensim/) +* several small fixes and optimizations + +0.7.8, 2011-03-26 + +* added `corpora.IndexedCorpus`, a base class for corpus serializers (thx to Dieter Plaetinck). This allows corpus formats that inherit from it (MmCorpus, SvmLightCorpus, BleiCorpus etc.) to retrieve individual documents by their id in O(1), e.g. `corpus[14]` returns document #14. +* merged new code from the LarKC.eu team (`corpora.textcorpus`, `models.logentropy_model`, lots of unit tests etc.) +* fixed a bug in `lda[bow]` transformation (was returning gamma distribution instead of theta). LDA model generation was not affected, only transforming new vectors. +* several small fixes and documentation updates + +0.7.7, 2011-02-13 + +* new LDA implementation after Hoffman et al.: Online Learning for Latent Dirichlet Allocation +* distributed LDA +* updated LDA docs (wiki experiments, distributed tutorial) +* matrixmarket header now uses capital 'M's: MatrixMarket. (André Lynum reported than Matlab has trouble processing the lowercase version) +* moved code to github +* started gensim Google group + +0.7.6, 2011-01-10 + +* added workaround for a bug in numpy: pickling a fortran-order array (e.g. LSA model) and then loading it back and using it results in segfault (thx to Brian Merrel) +* bundled a new version of ez_setup.py: old failed with Python2.6 when setuptools were missing (thx to Alan Salmoni). + +0.7.5, 2010-11-03 + +* further optimization to LSA; this is the version used in my NIPS workshop paper +* got rid of SVDLIBC dependency (one-pass LSA now uses stochastic algo for base-base decompositions) + +0.7.4 + +* sped up Latent Dirichlet ~10x (through scipy.weave, optional) +* finally, distributed LDA! scales almost linearly, but no tutorial yet. see the tutorial on distributed LSI, everything's completely analogous. +* several minor fixes and improvements; one nasty bug fixed (lsi[corpus] didn't work; thx to Danilo Spinelli) + +0.7.3 + +* added stochastic SVD decomposition (faster than the current one-pass LSI algo, but needs two passes over the input corpus) +* published gensim on mloss.org + +0.7.2 + +* added workaround for a numpy bug where SVD sometimes fails to converge for no good reason +* changed content of gensims's PyPi title page +* completed HTML tutorial on distributed LSA + +0.7.1 + +* fixed a bug in LSA that occurred when the number of features was smaller than the number of topics (thx to Richard Berendsen) + +0.7.0 + +* optimized vocabulary generation in gensim.corpora.dictionary (faster and less memory-intense) +* MmCorpus accepts compressed input (file-like objects such as GzipFile, BZ2File; to save disk space) +* changed sparse solver to SVDLIBC (sparsesvd on PyPi) for large document chunks +* added distributed LSA, updated tutorials (still experimental though) +* several minor bug fixes + +0.6.0 + +* added option for online LSI training (yay!). the transformation can now be + used after any amount of training, and training can be continued at any time + with more data. +* optimized the tf-idf transformation, so that it is a strictly one-pass algorithm in all cases (thx to Brian Merrell). +* fixed Windows-specific bug in handling binary files (thx to Sutee Sudprasert) +* fixed 1-based feature counting bug in SVMlight format (thx to Richard Berendsen) +* added 'Topic :: Text Processing :: Linguistic' to gensim's pypi classifiers +* change of sphinx documentation css and layout + +0.5.0 + +* finished all tutorials, stable version + +0.4.7 + +* tutorial on transformations + +0.4.6 + +* added Random Projections (aka Random Indexing), as another transformation model. +* several DML-CZ specific updates + +0.4.5 + +* updated documentation +* further memory optimizations in SVD (LSI) + +0.4.4 + +* added missing test files to MANIFEST.in + +0.4.3 + +* documentation changes +* added gensim reference to Wikipedia articles (SVD, LSI, LDA, TFIDF, ...) + +0.4.2 + +* finally, a tutorial! +* similarity queries got their own package + +0.4.1 + +* pdf documentation +* removed dependency on python2.5 (theoretically, gensim now runs on 2.6 and 2.7 as well). + +0.4.0 + +* support for ``python setup.py test`` +* fixing package metadata +* documentation clean-up + +0.2.0 + +* First version diff --git a/README.md b/README.md new file mode 100644 index 0000000000..f8b4a1c03c --- /dev/null +++ b/README.md @@ -0,0 +1,156 @@ +gensim – Topic Modelling in Python +================================== + +![Travis]![Wheel] + +Gensim is a Python library for *topic modelling*, *document indexing* +and *similarity retrieval* with large corpora. Target audience is the +*natural language processing* (NLP) and *information retrieval* (IR) +community. + +Features +-------- + +- All algorithms are **memory-independent** w.r.t. the corpus size + (can process input larger than RAM, streamed, out-of-core), +- **Intuitive interfaces** + - easy to plug in your own input corpus/datastream (trivial + streaming API) + - easy to extend with other Vector Space algorithms (trivial + transformation API) +- Efficient multicore implementations of popular algorithms, such as + online **Latent Semantic Analysis (LSA/LSI/SVD)**, **Latent + Dirichlet Allocation (LDA)**, **Random Projections (RP)**, + **Hierarchical Dirichlet Process (HDP)** or **word2vec deep + learning**. +- **Distributed computing**: can run *Latent Semantic Analysis* and + *Latent Dirichlet Allocation* on a cluster of computers. +- Extensive [documentation and Jupyter Notebook tutorials]. + +If this feature list left you scratching your head, you can first read +more about the [Vector Space Model] and [unsupervised document analysis] +on Wikipedia. + +Installation +------------ + +This software depends on [NumPy and Scipy], two Python packages for +scientific computing. You must have them installed prior to installing +gensim. + +It is also recommended you install a fast BLAS library before installing +NumPy. This is optional, but using an optimized BLAS such as [ATLAS] or +[OpenBLAS] is known to improve performance by as much as an order of +magnitude. On OS X, NumPy picks up the BLAS that comes with it +automatically, so you don’t need to do anything special. + +The simple way to install gensim is: + + pip install -U gensim + +Or, if you have instead downloaded and unzipped the [source tar.gz] +package, you’d run: + + python setup.py test + python setup.py install + +For alternative modes of installation (without root privileges, +development installation, optional install features), see the +[documentation]. + +This version has been tested under Python 2.6, 2.7, 3.3, 3.4 and 3.5 +(support for Python 2.5 was dropped in gensim 0.10.0; install gensim +0.9.1 if you *must* use Python 2.5). Gensim’s github repo is hooked +against [Travis CI for automated testing] on every commit push and pull +request. + +How come gensim is so fast and memory efficient? Isn’t it pure Python, and isn’t Python slow and greedy? +-------------------------------------------------------------------------------------------------------- + +Many scientific algorithms can be expressed in terms of large matrix +operations (see the BLAS note above). Gensim taps into these low-level +BLAS libraries, by means of its dependency on NumPy. So while +gensim-the-top-level-code is pure Python, it actually executes highly +optimized Fortran/C under the hood, including multithreading (if your +BLAS is so configured). + +Memory-wise, gensim makes heavy use of Python’s built-in generators and +iterators for streamed data processing. Memory efficiency was one of +gensim’s [design goals], and is a central feature of gensim, rather than +something bolted on as an afterthought. + +Documentation +------------- + +- [QuickStart] +- [Tutorials] +- [Tutorial Videos] +- [Official Documentation and Walkthrough] + + [QuickStart]: https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/gensim%20Quick%20Start.ipynb + [Tutorials]: https://github.com/RaRe-Technologies/gensim/blob/develop/tutorials.md#tutorials + [Tutorial Videos]: https://github.com/RaRe-Technologies/gensim/blob/develop/tutorials.md#videos + [Official Documentation and Walkthrough]: http://radimrehurek.com/gensim/ + +--------- + +Adopters +-------- + + + +| Name | Logo | URL | Description | +|----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| RaRe Technologies | | [rare-technologies.com](http://rare-technologies.com) | Machine Learning NLP consulting and training | +| Talentpair | ![Talentpair](https://avatars3.githubusercontent.com/u/8418395?v=3&s=100) | [talentpair.com](http://talentpair.com) | Data science driving high-touch recruiting | +| Tailwind | | [Tailwindapp.com](https://www.tailwindapp.com/)| Post interesting and relevant content to Pinterest | +| Issuu | | [Issuu.com](https://issuu.com/)| 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. +| Sports Authority | | [sportsauthority.com](http://www.sportsauthority.com)| Text mining of customer surveys and social media sources | +| Search Metrics | | [searchmetrics.com](http://www.searchmetrics.com/)| Gensim word2vec used for entity disambiguation in Search Engine Optimisation +| Cisco Security | | [cisco.com](http://www.cisco.com/c/en/us/products/security/index.html)| Large-scale fraud detection +| 12K Research | | [12k.co](https://12k.co/)| Document similarity analysis on media articles +| National Institutes of Health | | [github/NIHOPA](https://github.com/NIHOPA/pipeline_word2vec)| Processing grants and publications with word2vec +| Codeq LLC | | [codeq.com](https://codeq.com)| Document classification with word2vec + +------- + +Citing gensim +------------ + +When [citing gensim in academic papers and theses], please use this +BibTeX entry: + + @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}, + booktitle = {{Proceedings of the LREC 2010 Workshop on New + Challenges for NLP Frameworks}}, + pages = {45--50}, + year = 2010, + month = May, + day = 22, + publisher = {ELRA}, + address = {Valletta, Malta}, + note={\url{http://is.muni.cz/publication/884893/en}}, + language={English} + } + + [citing gensim in academic papers and theses]: https://scholar.google.cz/citations?view_op=view_citation&hl=en&user=9vG_kV0AAAAJ&citation_for_view=9vG_kV0AAAAJ:u-x6o8ySG0sC + + [Travis CI for automated testing]: https://travis-ci.org/RaRe-Technologies/gensim + [design goals]: http://radimrehurek.com/gensim/about.html + [RaRe Technologies]: http://rare-technologies.com/wp-content/uploads/2016/02/rare_image_only.png%20=10x20 + [rare\_tech]: //rare-technologies.com + [Talentpair]: https://avatars3.githubusercontent.com/u/8418395?v=3&s=100 + [citing gensim in academic papers and theses]: https://scholar.google.cz/citations?view_op=view_citation&hl=en&user=9vG_kV0AAAAJ&citation_for_view=9vG_kV0AAAAJ:u-x6o8ySG0sC + + [Travis]: https://img.shields.io/travis/RaRe-Technologies/gensim/develop.svg + [Wheel]: https://img.shields.io/pypi/wheel/gensim.svg + [documentation and Jupyter Notebook tutorials]: https://github.com/RaRe-Technologies/gensim/#documentation + [Vector Space Model]: http://en.wikipedia.org/wiki/Vector_space_model + [unsupervised document analysis]: http://en.wikipedia.org/wiki/Latent_semantic_indexing + [NumPy and Scipy]: http://www.scipy.org/Download + [ATLAS]: http://math-atlas.sourceforge.net/ + [OpenBLAS]: http://xianyi.github.io/OpenBLAS/ + [source tar.gz]: http://pypi.python.org/pypi/gensim + [documentation]: http://radimrehurek.com/gensim/install.html diff --git a/README.rst b/README.rst deleted file mode 100644 index 7e13400223..0000000000 --- a/README.rst +++ /dev/null @@ -1,104 +0,0 @@ -============================================== -gensim -- Topic Modelling in Python -============================================== - -|Travis|_ -|Wheel|_ - -.. |Travis| image:: https://img.shields.io/travis/RaRe-Technologies/gensim/develop.svg -.. |Wheel| image:: https://img.shields.io/pypi/wheel/gensim.svg - -.. _Travis: https://travis-ci.org/RaRe-Technologies/gensim -.. _Downloads: https://pypi.python.org/pypi/gensim -.. _License: http://radimrehurek.com/gensim/about.html -.. _Wheel: https://pypi.python.org/pypi/gensim - -Gensim is a Python library for *topic modelling*, *document indexing* and *similarity retrieval* with large corpora. -Target audience is the *natural language processing* (NLP) and *information retrieval* (IR) community. - -Features ---------- - -* All algorithms are **memory-independent** w.r.t. the corpus size (can process input larger than RAM, streamed, out-of-core), -* **Intuitive interfaces** - - * easy to plug in your own input corpus/datastream (trivial streaming API) - * easy to extend with other Vector Space algorithms (trivial transformation API) - -* Efficient multicore implementations of popular algorithms, such as online **Latent Semantic Analysis (LSA/LSI/SVD)**, - **Latent Dirichlet Allocation (LDA)**, **Random Projections (RP)**, **Hierarchical Dirichlet Process (HDP)** or **word2vec deep learning**. -* **Distributed computing**: can run *Latent Semantic Analysis* and *Latent Dirichlet Allocation* on a cluster of computers. -* Extensive `HTML documentation and tutorials `_. - - -If this feature list left you scratching your head, you can first read more about the `Vector -Space Model `_ and `unsupervised -document analysis `_ on Wikipedia. - -Installation ------------- - -This software depends on `NumPy and Scipy `_, two Python packages for scientific computing. -You must have them installed prior to installing `gensim`. - -It is also recommended you install a fast BLAS library before installing NumPy. This is optional, but using an optimized BLAS such as `ATLAS `_ or `OpenBLAS `_ is known to improve performance by as much as an order of magnitude. On OS X, NumPy picks up the BLAS that comes with it automatically, so you don't need to do anything special. - -The simple way to install `gensim` is:: - - pip install -U gensim - -Or, if you have instead downloaded and unzipped the `source tar.gz `_ package, -you'd run:: - - python setup.py test - python setup.py install - - -For alternative modes of installation (without root privileges, development -installation, optional install features), see the `documentation `_. - -This version has been tested under Python 2.6, 2.7, 3.3, 3.4 and 3.5 (support for Python 2.5 was dropped in gensim 0.10.0; install gensim 0.9.1 if you *must* use Python 2.5). Gensim's github repo is hooked against `Travis CI for automated testing `_ on every commit push and pull request. - -How come gensim is so fast and memory efficient? Isn't it pure Python, and isn't Python slow and greedy? --------------------------------------------------------------------------------------------------------- - -Many scientific algorithms can be expressed in terms of large matrix operations (see the BLAS note above). Gensim taps into these low-level BLAS libraries, by means of its dependency on NumPy. So while gensim-the-top-level-code is pure Python, it actually executes highly optimized Fortran/C under the hood, including multithreading (if your BLAS is so configured). - -Memory-wise, gensim makes heavy use of Python's built-in generators and iterators for streamed data processing. Memory efficiency was one of gensim's `design goals `_, and is a central feature of gensim, rather than something bolted on as an afterthought. - -Documentation -------------- - -Manual for the gensim package is available in `HTML `_. It -contains a walk-through of all its features and a complete reference section. -It is also included in the source distribution package. - -Citing gensim -------------- - -When `citing gensim in academic papers and theses `_, please use this BibTeX entry:: - - @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}, - booktitle = {{Proceedings of the LREC 2010 Workshop on New - Challenges for NLP Frameworks}}, - pages = {45--50}, - year = 2010, - month = May, - day = 22, - publisher = {ELRA}, - address = {Valletta, Malta}, - note={\url{http://is.muni.cz/publication/884893/en}}, - language={English} - } - ----------------- - -Gensim is open source software released under the `GNU LGPLv2.1 license `_. -Copyright (c) 2009-now Radim Rehurek - -|Analytics|_ - -.. |Analytics| image:: https://ga-beacon.appspot.com/UA-24066335-5/your-repo/page-name -.. _Analytics: https://github.com/igrigorik/ga-beacon diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py new file mode 100644 index 0000000000..b2ec6222d1 --- /dev/null +++ b/gensim/models/word2vec.py @@ -0,0 +1,1831 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + + +""" +Deep learning via word2vec's "skip-gram and CBOW models", using either +hierarchical softmax or negative sampling [1]_ [2]_. + +The training algorithms were originally ported from the C package https://code.google.com/p/word2vec/ +and extended with additional functionality. + +For a blog tutorial on gensim word2vec, with an interactive web app trained on GoogleNews, visit http://radimrehurek.com/2014/02/word2vec-tutorial/ + +**Make sure you have a C compiler before installing gensim, to use optimized (compiled) word2vec training** +(70x speedup compared to plain NumPy implementation [3]_). + +Initialize a model with e.g.:: + +>>> model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) + +Persist a model to disk with:: + +>>> model.save(fname) +>>> model = Word2Vec.load(fname) # you can continue training with the loaded model! + +The model can also be instantiated from an existing file on disk in the word2vec C format:: + + >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False) # C text format + >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.bin', binary=True) # C binary format + +You can perform various syntactic/semantic NLP word tasks with the model. Some of them +are already built-in:: + + >>> model.most_similar(positive=['woman', 'king'], negative=['man']) + [('queen', 0.50882536), ...] + + >>> model.doesnt_match("breakfast cereal dinner lunch".split()) + 'cereal' + + >>> model.similarity('woman', 'man') + 0.73723527 + + >>> model['computer'] # raw numpy vector of a word + array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32) + +and so on. + +If you're finished training a model (=no more updates, only querying), you can do + + >>> model.init_sims(replace=True) + +to trim unneeded model memory = use (much) less RAM. + +Note that there is a :mod:`gensim.models.phrases` module which lets you automatically +detect phrases longer than one word. Using phrases, you can learn a word2vec model +where "words" are actually multiword expressions, such as `new_york_times` or `financial_crisis`: + +>>> bigram_transformer = gensim.models.Phrases(sentences) +>>> model = Word2Vec(bigram_transformer[sentences], size=100, ...) + +.. [1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013. +.. [2] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their Compositionality. + In Proceedings of NIPS, 2013. +.. [3] Optimizing word2vec in gensim, http://radimrehurek.com/2013/09/word2vec-in-python-part-two-optimizing/ +""" +from __future__ import division # py3 "true division" + +import logging +import sys +import os +import heapq +from timeit import default_timer +from copy import deepcopy +from collections import defaultdict +import threading +import itertools + +from gensim.utils import keep_vocab_item + +try: + from queue import Queue, Empty +except ImportError: + from Queue import Queue, Empty + +from numpy import exp, log, dot, zeros, outer, random, dtype, float32 as REAL,\ + double, uint32, seterr, array, uint8, vstack, fromstring, sqrt, newaxis,\ + ndarray, empty, sum as np_sum, prod, ones, ascontiguousarray + +from gensim import utils, matutils # utility fnc for pickling, common scipy operations etc +from gensim.corpora.dictionary import Dictionary +from six import iteritems, itervalues, string_types +from six.moves import xrange +from types import GeneratorType + +logger = logging.getLogger(__name__) + +try: + from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow + from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow + from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH + logger.debug('Fast version of {0} is being used'.format(__name__)) +except ImportError: + # failed... fall back to plain numpy (20-80x slower training than the above) + logger.warning('Slow version of {0} is being used'.format(__name__)) + FAST_VERSION = -1 + MAX_WORDS_IN_BATCH = 10000 + + def train_batch_sg(model, sentences, alpha, work=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 `Word2Vec.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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) + for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): + # don't train on the `word` itself + if pos2 != pos: + train_sg_pair(model, model.index2word[word.index], word2.index, alpha) + result += len(word_vocabs) + return result + + 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 `Word2Vec.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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 + 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)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + train_cbow_pair(model, word, word2_indices, l1, alpha) + result += len(word_vocabs) + return result + + def score_sentence_sg(model, sentence, work=None): + """ + Obtain likelihood score for a single sentence in a fitted skip-gram representaion. + + The sentence is a list of Vocab objects (or None, when the corresponding + word is not in the vocabulary). Called internally from `Word2Vec.score()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + + log_prob_sentence = 0.0 + if model.negative: + raise RuntimeError("scoring is only available for HS=True") + + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + for pos, word in enumerate(word_vocabs): + if word is None: + continue # OOV word in the input sentence => skip + + # now go over all words from the window, predicting each one in turn + start = max(0, pos - model.window) + for pos2, word2 in enumerate(word_vocabs[start : pos + model.window + 1], start): + # don't train on OOV words and on the `word` itself + if word2 is not None and pos2 != pos: + log_prob_sentence += score_sg_pair(model, word, word2) + + return log_prob_sentence + + def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): + """ + Obtain likelihood score for a single sentence in a fitted CBOW representaion. + + The sentence is a list of Vocab objects (or None, where the corresponding + word is not in the vocabulary. Called internally from `Word2Vec.score()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + log_prob_sentence = 0.0 + if model.negative: + raise RuntimeError("scoring is only available for HS=True") + + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + for pos, word in enumerate(word_vocabs): + if word is None: + continue # OOV word in the input sentence => skip + + start = max(0, pos - model.window) + window_pos = enumerate(word_vocabs[start:(pos + model.window + 1)], start) + word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x layer1_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + log_prob_sentence += score_cbow_pair(model, word, word2_indices, l1) + + return log_prob_sentence + +# If pyemd C extension is available, import it. +# If pyemd is attempted to be used, but isn't installed, ImportError will be raised. +try: + from pyemd import emd + PYEMD_EXT = True +except ImportError: + PYEMD_EXT = False + +def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_hidden=True, + context_vectors=None, context_locks=None): + if context_vectors is None: + context_vectors = model.syn0 + if context_locks is None: + context_locks = model.syn0_lockf + + if word not in model.vocab: + return + predict_word = model.vocab[word] # target word (NN output) + + l1 = context_vectors[context_index] # input word (NN input/projection layer) + lock_factor = context_locks[context_index] + + neu1e = zeros(l1.shape) + + if model.hs: + # work on the entire tree at once, to push as much work into numpy's C routines as possible (performance) + l2a = deepcopy(model.syn1[predict_word.point]) # 2d matrix, codelen x layer1_size + fa = 1.0 / (1.0 + exp(-dot(l1, l2a.T))) # propagate hidden -> output + ga = (1 - predict_word.code - fa) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1[predict_word.point] += outer(ga, l1) # learn hidden -> output + neu1e += dot(ga, l2a) # save error + + if model.negative: + # use this word (label = 1) + `negative` other random words not from this sentence (label = 0) + word_indices = [predict_word.index] + while len(word_indices) < model.negative + 1: + w = model.cum_table.searchsorted(model.random.randint(model.cum_table[-1])) + if w != predict_word.index: + word_indices.append(w) + l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size + fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output + gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output + neu1e += dot(gb, l2b) # save error + + if learn_vectors: + l1 += neu1e * lock_factor # learn input -> hidden (mutates model.syn0[word2.index], if that is l1) + return neu1e + + +def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=True, learn_hidden=True): + neu1e = zeros(l1.shape) + + if model.hs: + l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size + fa = 1. / (1. + exp(-dot(l1, l2a.T))) # propagate hidden -> output + ga = (1. - word.code - fa) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1[word.point] += outer(ga, l1) # learn hidden -> output + neu1e += dot(ga, l2a) # save error + + if model.negative: + # use this word (label = 1) + `negative` other random words not from this sentence (label = 0) + word_indices = [word.index] + while len(word_indices) < model.negative + 1: + w = model.cum_table.searchsorted(model.random.randint(model.cum_table[-1])) + if w != word.index: + word_indices.append(w) + l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size + fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output + gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output + neu1e += dot(gb, l2b) # save error + + if learn_vectors: + # learn input -> hidden, here for all words in the window separately + if not model.cbow_mean and input_word_indices: + neu1e /= len(input_word_indices) + for i in input_word_indices: + model.syn0[i] += neu1e * model.syn0_lockf[i] + + return neu1e + + +def score_sg_pair(model, word, word2): + l1 = model.syn0[word2.index] + l2a = deepcopy(model.syn1[word.point]) # 2d matrix, codelen x layer1_size + sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1 + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + return sum(lprob) + + +def score_cbow_pair(model, word, word2_indices, l1): + l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size + sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1 + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + return sum(lprob) + + +class Vocab(object): + """ + A single vocabulary item, used internally for collecting per-word frequency/sampling info, + and for constructing binary trees (incl. both word leaves and inner nodes). + + """ + def __init__(self, **kwargs): + self.count = 0 + self.__dict__.update(kwargs) + + def __lt__(self, other): # used for sorting in a priority queue + return self.count < other.count + + def __str__(self): + vals = ['%s:%r' % (key, self.__dict__[key]) for key in sorted(self.__dict__) if not key.startswith('_')] + return "%s(%s)" % (self.__class__.__name__, ', '.join(vals)) + + +class Word2Vec(utils.SaveLoad): + """ + Class for training, using and evaluating neural networks described in https://code.google.com/p/word2vec/ + + The model can be stored/loaded via its `save()` and `load()` methods, or stored/loaded in a format + compatible with the original word2vec implementation via `save_word2vec_format()` and `load_word2vec_format()`. + + """ + def __init__( + self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, + max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, + sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, + trim_rule=None, sorted_vocab=1, 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. + + The `sentences` iterable can be simply a list, but for larger corpora, + consider an iterable that streams the sentences directly from disk/network. + See :class:`BrownCorpus`, :class:`Text8Corpus` or :class:`LineSentence` in + this 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` defines the training algorithm. By default (`sg=0`), CBOW is used. + Otherwise (`sg=1`), skip-gram is employed. + + `size` is the dimensionality of the feature vectors. + + `window` is the maximum distance between the current and predicted word within a sentence. + + `alpha` is the initial learning rate (will linearly drop to `min_alpha` as training progresses). + + `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, 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` = ignore all words with total frequency lower than this. + + `max_vocab_size` = limit 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 (default). + + `sample` = threshold for configuring which higher-frequency words are randomly downsampled; + default is 1e-3, useful range is (0, 1e-5). + + `workers` = use this many worker threads to train the model (=faster training with multicore machines). + + `hs` = if 1, hierarchical softmax will be used for model training. + If set to 0 (default), and `negative` is non-zero, negative sampling will be used. + + `negative` = if > 0, negative sampling will be used, the int for negative + specifies how many "noise words" should be drawn (usually between 5-20). + Default is 5. If set to 0, no negative samping is used. + + `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. + Only applies when cbow is used. + + `hashfxn` = hash function to use to randomly initialize weights, for increased + training reproducibility. Default is Python's rudimentary built in hash function. + + `iter` = number of iterations (epochs) over the corpus. Default is 5. + + `trim_rule` = 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), or a callable that accepts parameters (word, count, min_count) and + returns either util.RULE_DISCARD, util.RULE_KEEP or util.RULE_DEFAULT. + Note: The rule, if given, is only used prune vocabulary during build_vocab() and is not stored as part + of the model. + + `sorted_vocab` = if 1 (default), sort the vocabulary by descending frequency before + assigning word indexes. + + `batch_words` = target size (in words) for batches of examples passed to worker threads (and + thus cython routines). Default is 10000. (Larger batches will be passed if individual + texts are longer than 10000 words, but the standard cython code truncates to that maximum.) + + """ + self.vocab = {} # mapping from a word (string) to a Vocab object + self.index2word = [] # map from a word's matrix index (int) to word (string) + self.sg = int(sg) + self.cum_table = None # for negative sampling + self.vector_size = int(size) + self.layer1_size = int(size) + if size % 4 != 0: + logger.warning("consider setting layer size to a multiple of 4 for greater performance") + self.alpha = float(alpha) + self.min_alpha_yet_reached = float(alpha) # To warn user if alpha increases + self.window = int(window) + self.max_vocab_size = max_vocab_size + self.seed = seed + self.random = random.RandomState(seed) + self.min_count = min_count + self.sample = sample + self.workers = int(workers) + self.min_alpha = float(min_alpha) + self.hs = hs + self.negative = negative + self.cbow_mean = int(cbow_mean) + self.hashfxn = hashfxn + self.iter = iter + self.null_word = null_word + self.train_count = 0 + self.total_train_time = 0 + self.sorted_vocab = sorted_vocab + self.batch_words = batch_words + + if sentences is not None: + if isinstance(sentences, GeneratorType): + raise TypeError("You can't pass a generator as the sentences argument. Try an iterator.") + self.build_vocab(sentences, trim_rule=trim_rule) + self.train(sentences) + + def make_cum_table(self, power=0.75, domain=2**31 - 1): + """ + Create a cumulative-distribution table using stored vocabulary word counts for + drawing random words in the negative-sampling training routines. + + To draw a word index, choose a random integer up to the maximum value in the + table (cum_table[-1]), then finding that integer's sorted insertion point + (as if by bisect_left or ndarray.searchsorted()). That insertion point is the + drawn index, coming up in proportion equal to the increment at that slot. + + Called internally from 'build_vocab()'. + """ + vocab_size = len(self.index2word) + self.cum_table = zeros(vocab_size, dtype=uint32) + # compute sum of all power (Z in paper) + train_words_pow = float(sum([self.vocab[word].count**power for word in self.vocab])) + cumulative = 0.0 + for word_index in range(vocab_size): + cumulative += self.vocab[self.index2word[word_index]].count**power / train_words_pow + self.cum_table[word_index] = round(cumulative * domain) + if len(self.cum_table) > 0: + assert self.cum_table[-1] == domain + + def create_binary_tree(self): + """ + Create a binary Huffman tree using stored vocabulary word counts. Frequent words + will have shorter binary codes. Called internally from `build_vocab()`. + + """ + logger.info("constructing a huffman tree from %i words", len(self.vocab)) + + # build the huffman tree + heap = list(itervalues(self.vocab)) + heapq.heapify(heap) + for i in xrange(len(self.vocab) - 1): + min1, min2 = heapq.heappop(heap), heapq.heappop(heap) + heapq.heappush(heap, Vocab(count=min1.count + min2.count, index=i + len(self.vocab), left=min1, right=min2)) + + # recurse over the tree, assigning a binary code to each vocabulary word + if heap: + max_depth, stack = 0, [(heap[0], [], [])] + while stack: + node, codes, points = stack.pop() + if node.index < len(self.vocab): + # leaf node => store its path from the root + node.code, node.point = codes, points + max_depth = max(len(codes), max_depth) + else: + # inner node => continue recursion + points = array(list(points) + [node.index - len(self.vocab)], dtype=uint32) + stack.append((node.left, array(list(codes) + [0], dtype=uint8), points)) + stack.append((node.right, array(list(codes) + [1], dtype=uint8), points)) + + logger.info("built huffman tree with maximum node depth %i", max_depth) + + def build_vocab(self, sentences, keep_raw_vocab=False, trim_rule=None, progress_per=10000): + """ + Build vocabulary from a sequence of sentences (can be a once-only generator stream). + Each sentence must be a list of unicode strings. + + """ + self.scan_vocab(sentences, progress_per=progress_per, trim_rule=trim_rule) # initial survey + self.scale_vocab(keep_raw_vocab=keep_raw_vocab, trim_rule=trim_rule) # trim by min_count & precalculate downsampling + self.finalize_vocab() # build tables & arrays + + def scan_vocab(self, sentences, progress_per=10000, trim_rule=None): + """Do an initial scan of all words appearing in sentences.""" + logger.info("collecting all words and their counts") + sentence_no = -1 + total_words = 0 + min_reduce = 1 + vocab = defaultdict(int) + checked_string_types = 0 + for sentence_no, sentence in enumerate(sentences): + if not checked_string_types: + if isinstance(sentence, string_types): + logger.warn("Each 'sentences' item should be a list of words (usually unicode strings)." + "First item here is instead plain %s.", type(sentence)) + checked_string_types += 1 + if sentence_no % progress_per == 0: + logger.info("PROGRESS: at sentence #%i, processed %i words, keeping %i word types", + sentence_no, sum(itervalues(vocab)) + total_words, len(vocab)) + for word in sentence: + vocab[word] += 1 + + if self.max_vocab_size and len(vocab) > self.max_vocab_size: + total_words += utils.prune_vocab(vocab, min_reduce, trim_rule=trim_rule) + min_reduce += 1 + + total_words += sum(itervalues(vocab)) + logger.info("collected %i word types from a corpus of %i raw words and %i sentences", + len(vocab), total_words, sentence_no + 1) + self.corpus_count = sentence_no + 1 + self.raw_vocab = vocab + + def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab=False, trim_rule=None): + """ + Apply vocabulary settings for `min_count` (discarding less-frequent words) + and `sample` (controlling the downsampling of more-frequent words). + + Calling with `dry_run=True` will only simulate the provided settings and + report the size of the retained vocabulary, effective corpus length, and + estimated memory requirements. Results are both printed via logging and + returned as a dict. + + Delete the raw vocabulary after the scaling is done to free up RAM, + unless `keep_raw_vocab` is set. + + """ + min_count = min_count or self.min_count + sample = sample or self.sample + + # Discard words less-frequent than min_count + if not dry_run: + self.index2word = [] + # make stored settings match these applied settings + self.min_count = min_count + self.sample = sample + self.vocab = {} + drop_unique, drop_total, retain_total, original_total = 0, 0, 0, 0 + retain_words = [] + for word, v in iteritems(self.raw_vocab): + if keep_vocab_item(word, v, min_count, trim_rule=trim_rule): + retain_words.append(word) + retain_total += v + original_total += v + if not dry_run: + self.vocab[word] = Vocab(count=v, index=len(self.index2word)) + self.index2word.append(word) + else: + drop_unique += 1 + drop_total += v + original_total += v + logger.info("min_count=%d retains %i unique words (drops %i)", + min_count, len(retain_words), drop_unique) + logger.info("min_count leaves %i word corpus (%i%% of original %i)", + retain_total, retain_total * 100 / max(original_total, 1), original_total) + + # Precalculate each vocabulary item's threshold for sampling + if not sample: + # no words downsampled + threshold_count = retain_total + elif sample < 1.0: + # traditional meaning: set parameter as proportion of total + threshold_count = sample * retain_total + else: + # new shorthand: sample >= 1 means downsample all words with higher count than sample + threshold_count = int(sample * (3 + sqrt(5)) / 2) + + downsample_total, downsample_unique = 0, 0 + for w in retain_words: + v = self.raw_vocab[w] + word_probability = (sqrt(v / threshold_count) + 1) * (threshold_count / v) + if word_probability < 1.0: + downsample_unique += 1 + downsample_total += word_probability * v + else: + word_probability = 1.0 + downsample_total += v + if not dry_run: + self.vocab[w].sample_int = int(round(word_probability * 2**32)) + + if not dry_run and not keep_raw_vocab: + logger.info("deleting the raw counts dictionary of %i items", len(self.raw_vocab)) + self.raw_vocab = defaultdict(int) + + logger.info("sample=%g downsamples %i most-common words", sample, downsample_unique) + logger.info("downsampling leaves estimated %i word corpus (%.1f%% of prior %i)", + downsample_total, downsample_total * 100.0 / max(retain_total, 1), retain_total) + + # return from each step: words-affected, resulting-corpus-size + report_values = {'drop_unique': drop_unique, 'retain_total': retain_total, + 'downsample_unique': downsample_unique, 'downsample_total': int(downsample_total)} + + # print extra memory estimates + report_values['memory'] = self.estimate_memory(vocab_size=len(retain_words)) + + return report_values + + def finalize_vocab(self): + """Build tables and model weights based on final vocabulary settings.""" + if not self.index2word: + self.scale_vocab() + if self.sorted_vocab: + self.sort_vocab() + if self.hs: + # add info about each word's Huffman encoding + self.create_binary_tree() + if self.negative: + # build the table for drawing random words (for negative sampling) + self.make_cum_table() + if self.null_word: + # create null pseudo-word for padding when using concatenative L1 (run-of-words) + # this word is only ever input – never predicted – so count, huffman-point, etc doesn't matter + word, v = '\0', Vocab(count=1, sample_int=0) + v.index = len(self.vocab) + self.index2word.append(word) + self.vocab[word] = v + # set initial input/projection and hidden weights + self.reset_weights() + + def sort_vocab(self): + """Sort the vocabulary so the most frequent words have the lowest indexes.""" + if hasattr(self, 'syn0'): + raise RuntimeError("must sort before initializing vectors/weights") + self.index2word.sort(key=lambda word: self.vocab[word].count, reverse=True) + for i, word in enumerate(self.index2word): + self.vocab[word].index = i + + def reset_from(self, other_model): + """ + Borrow shareable pre-built structures (like vocab) from the other_model. Useful + if testing multiple models in parallel on the same corpus. + """ + self.vocab = other_model.vocab + self.index2word = other_model.index2word + self.cum_table = other_model.cum_table + self.corpus_count = other_model.corpus_count + self.reset_weights() + + 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)`. + """ + work, neu1 = inits + tally = 0 + if self.sg: + tally += train_batch_sg(self, sentences, alpha, work) + else: + tally += train_batch_cbow(self, sentences, alpha, work, neu1) + return tally, self._raw_word_count(sentences) + + def _raw_word_count(self, job): + """Return the number of words in a given job.""" + return sum(len(sentence) for sentence in job) + + def train(self, sentences, total_words=None, word_count=0, + total_examples=None, 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 Word2Vec, 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, either total_examples + (count of sentences) or total_words (count of raw words in sentences) should be provided, unless the + sentences are the same as those that were used to initially build the vocabulary. + + """ + if FAST_VERSION < 0: + import warnings + warnings.warn("C extension not loaded for Word2Vec, training will be slow. " + "Install a C compiler and reinstall gensim for fast training.") + 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. + + logger.info( + "training model with %i workers on %i vocabulary and %i features, " + "using sg=%s hs=%s sample=%s negative=%s", + self.workers, len(self.vocab), self.layer1_size, self.sg, + self.hs, self.sample, self.negative) + + if not self.vocab: + raise RuntimeError("you must first build vocabulary before training the model") + if not hasattr(self, 'syn0'): + raise RuntimeError("you must first finalize vocabulary before training the model") + + if total_words is None and total_examples is None: + if self.corpus_count: + total_examples = self.corpus_count + logger.info("expecting %i sentences, matching count from corpus used for vocabulary survey", total_examples) + else: + raise ValueError("you must provide either total_words or total_examples, to enable alpha and progress calculations") + + job_tally = 0 + + if self.iter > 1: + sentences = utils.RepeatCorpusNTimes(sentences, self.iter) + total_words = total_words and total_words * self.iter + total_examples = total_examples and total_examples * self.iter + + def worker_loop(): + """Train the model, lifting lists of sentences from the job_queue.""" + work = matutils.zeros_aligned(self.layer1_size, dtype=REAL) # per-thread private work memory + neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) + jobs_processed = 0 + while True: + job = job_queue.get() + if job is None: + progress_queue.put(None) + break # no more jobs => quit this worker + sentences, alpha = job + tally, raw_tally = self._do_train_job(sentences, alpha, (work, neu1)) + progress_queue.put((len(sentences), tally, raw_tally)) # report back progress + jobs_processed += 1 + logger.debug("worker exiting, processed %i jobs", jobs_processed) + + def job_producer(): + """Fill jobs queue using the input `sentences` iterator.""" + job_batch, batch_size = [], 0 + pushed_words, pushed_examples = 0, 0 + next_alpha = self.alpha + if next_alpha > self.min_alpha_yet_reached: + logger.warn("Effective 'alpha' higher than previous training cycles") + self.min_alpha_yet_reached = next_alpha + job_no = 0 + + for sent_idx, sentence in enumerate(sentences): + sentence_length = self._raw_word_count([sentence]) + + # can we fit this sentence into the existing job batch? + if batch_size + sentence_length <= self.batch_words: + # yes => add it to the current job + job_batch.append(sentence) + batch_size += sentence_length + else: + # no => submit the existing job + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 + job_queue.put((job_batch, next_alpha)) + + # update the learning rate for the next job + if self.min_alpha < next_alpha: + if total_examples: + # examples-based decay + pushed_examples += len(job_batch) + progress = 1.0 * pushed_examples / total_examples + else: + # words-based decay + pushed_words += self._raw_word_count(job_batch) + progress = 1.0 * pushed_words / total_words + next_alpha = self.alpha - (self.alpha - self.min_alpha) * progress + next_alpha = max(self.min_alpha, next_alpha) + + # add the sentence that didn't fit as the first item of a new job + job_batch, batch_size = [sentence], sentence_length + + # add the last job too (may be significantly smaller than batch_words) + if job_batch: + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 + job_queue.put((job_batch, next_alpha)) + + if job_no == 0 and self.train_count == 0: + logger.warning( + "train() called with an empty iterator (if not intended, " + "be sure to provide a corpus that offers restartable " + "iteration = an iterable)." + ) + + # give the workers heads up that they can finish -- no more work! + for _ in xrange(self.workers): + job_queue.put(None) + logger.debug("job loop exiting, total %i jobs", job_no) + + # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( + job_queue = Queue(maxsize=queue_factor * self.workers) + progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) + + workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + unfinished_worker_count = len(workers) + workers.append(threading.Thread(target=job_producer)) + + for thread in workers: + thread.daemon = True # make interrupting the process with ctrl+c easier + thread.start() + + example_count, trained_word_count, raw_word_count = 0, 0, word_count + start, next_report = default_timer() - 0.00001, 1.0 + + while unfinished_worker_count > 0: + report = progress_queue.get() # blocks if workers too slow + if report is None: # a thread reporting that it finished + unfinished_worker_count -= 1 + logger.info("worker thread finished; awaiting finish of %i more threads", unfinished_worker_count) + continue + examples, trained_words, raw_words = report + job_tally += 1 + + # update progress stats + example_count += examples + trained_word_count += trained_words # only words in vocab & sampled + raw_word_count += raw_words + + # log progress once every report_delay seconds + elapsed = default_timer() - start + if elapsed >= next_report: + if total_examples: + # examples-based progress % + logger.info( + "PROGRESS: at %.2f%% examples, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * example_count / total_examples, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + else: + # words-based progress % + logger.info( + "PROGRESS: at %.2f%% words, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * raw_word_count / total_words, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + next_report = elapsed + report_delay + + # all done; report the final stats + elapsed = default_timer() - start + logger.info( + "training on %i raw words (%i effective words) took %.1fs, %.0f effective words/s", + raw_word_count, trained_word_count, elapsed, trained_word_count / elapsed) + if job_tally < 10 * self.workers: + logger.warn("under 10 jobs per worker: consider setting a smaller `batch_words' for smoother alpha decay") + + # check that the input corpus hasn't changed during iteration + if total_examples and total_examples != example_count: + logger.warn("supplied example count (%i) did not equal expected count (%i)", example_count, total_examples) + if total_words and total_words != raw_word_count: + logger.warn("supplied raw word count (%i) did not equal expected count (%i)", raw_word_count, total_words) + + self.train_count += 1 # number of times train() has been called + self.total_train_time += elapsed + self.clear_sims() + return trained_word_count + + # basics copied from the train() function + def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor=2, report_delay=1): + """ + Score the log probability for a sequence of sentences (can be a once-only generator stream). + Each sentence must be a list of unicode strings. + This does not change the fitted model in any way (see Word2Vec.train() for that). + + We have currently only implemented score for the hierarchical softmax scheme, + so you need to have run word2vec with hs=1 and negative=0 for this to work. + + Note that you should specify total_sentences; we'll run into problems if you ask to + score more than this number of sentences but it is inefficient to set the value too high. + + See the article by [taddy]_ and the gensim demo at [deepir]_ for examples of how to use such scores in document classification. + + .. [taddy] Taddy, Matt. Document Classification by Inversion of Distributed Language Representations, in Proceedings of the 2015 Conference of the Association of Computational Linguistics. + .. [deepir] https://github.com/piskvorky/gensim/blob/develop/docs/notebooks/deepir.ipynb + + """ + if FAST_VERSION < 0: + import warnings + warnings.warn("C extension compilation failed, scoring will be slow. " + "Install a C compiler and reinstall gensim for fastness.") + + logger.info( + "scoring sentences with %i workers on %i vocabulary and %i features, " + "using sg=%s hs=%s sample=%s and negative=%s", + self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) + + if not self.vocab: + raise RuntimeError("you must first build vocabulary before scoring new data") + + if not self.hs: + raise RuntimeError("we have only implemented score for hs") + + def worker_loop(): + """Train the model, lifting lists of sentences from the jobs queue.""" + work = zeros(1, dtype=REAL) # for sg hs, we actually only need one memory loc (running sum) + neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) + while True: + job = job_queue.get() + if job is None: # signal to finish + break + ns = 0 + for sentence_id, sentence in job: + if sentence_id >= total_sentences: + break + if self.sg: + score = score_sentence_sg(self, sentence, work) + else: + score = score_sentence_cbow(self, sentence, work, neu1) + sentence_scores[sentence_id] = score + ns += 1 + progress_queue.put(ns) # report progress + + start, next_report = default_timer(), 1.0 + # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( + job_queue = Queue(maxsize=queue_factor * self.workers) + progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) + + workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + for thread in workers: + thread.daemon = True # make interrupting the process with ctrl+c easier + thread.start() + + sentence_count = 0 + sentence_scores = matutils.zeros_aligned(total_sentences, dtype=REAL) + + push_done = False + done_jobs = 0 + jobs_source = enumerate(utils.grouper(enumerate(sentences), chunksize)) + + # fill jobs queue with (id, sentence) job items + while True: + try: + job_no, items = next(jobs_source) + if (job_no - 1) * chunksize > total_sentences: + logger.warning( + "terminating after %i sentences (set higher total_sentences if you want more).", + total_sentences) + job_no -= 1 + raise StopIteration() + logger.debug("putting job #%i in the queue", job_no) + job_queue.put(items) + except StopIteration: + logger.info( + "reached end of input; waiting to finish %i outstanding jobs", + job_no - done_jobs + 1) + for _ in xrange(self.workers): + job_queue.put(None) # give the workers heads up that they can finish -- no more work! + push_done = True + try: + while done_jobs < (job_no + 1) or not push_done: + ns = progress_queue.get(push_done) # only block after all jobs pushed + sentence_count += ns + done_jobs += 1 + elapsed = default_timer() - start + if elapsed >= next_report: + logger.info( + "PROGRESS: at %.2f%% sentences, %.0f sentences/s", + 100.0 * sentence_count, sentence_count / elapsed) + next_report = elapsed + report_delay # don't flood log, wait report_delay seconds + else: + # loop ended by job count; really done + break + except Empty: + pass # already out of loop; continue to next push + + elapsed = default_timer() - start + self.clear_sims() + logger.info( + "scoring %i sentences took %.1fs, %.0f sentences/s", + sentence_count, elapsed, sentence_count / elapsed) + return sentence_scores[:sentence_count] + + def clear_sims(self): + self.syn0norm = None + + def reset_weights(self): + """Reset all projection weights to an initial (untrained) state, but keep the existing vocabulary.""" + logger.info("resetting layer weights") + self.syn0 = empty((len(self.vocab), self.vector_size), dtype=REAL) + # randomize weights vector by vector, rather than materializing a huge random matrix in RAM at once + for i in xrange(len(self.vocab)): + # construct deterministic seed from word AND seed argument + self.syn0[i] = self.seeded_vector(self.index2word[i] + str(self.seed)) + if self.hs: + self.syn1 = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + if self.negative: + self.syn1neg = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + self.syn0norm = None + + self.syn0_lockf = ones(len(self.vocab), dtype=REAL) # zeros suppress learning + + def seeded_vector(self, seed_string): + """Create one 'random' vector (but deterministic by seed_string)""" + # Note: built-in hash() may vary by Python version or even (in Py3.x) per launch + once = random.RandomState(self.hashfxn(seed_string) & 0xffffffff) + return (once.rand(self.vector_size) - 0.5) / self.vector_size + + def save_word2vec_format(self, fname, fvocab=None, binary=False): + """ + Store the input-hidden weight matrix in the same format used by the original + C word2vec-tool, for compatibility. + + `fname` is the file used to save the vectors in + `fvocab` is an optional file used to save the vocabulary + `binary` is an optional boolean indicating whether the data is to be saved + in binary word2vec format (default: False) + + """ + if fvocab is not None: + logger.info("storing vocabulary in %s" % (fvocab)) + with utils.smart_open(fvocab, 'wb') as vout: + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + vout.write(utils.to_utf8("%s %s\n" % (word, vocab.count))) + logger.info("storing %sx%s projection weights into %s" % (len(self.vocab), self.vector_size, fname)) + assert (len(self.vocab), self.vector_size) == self.syn0.shape + with utils.smart_open(fname, 'wb') as fout: + fout.write(utils.to_utf8("%s %s\n" % self.syn0.shape)) + # store in sorted order: most frequent words at the top + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + row = self.syn0[vocab.index] + if binary: + fout.write(utils.to_utf8(word) + b" " + row.tostring()) + else: + fout.write(utils.to_utf8("%s %s\n" % (word, ' '.join("%f" % val for val in row)))) + + @classmethod + def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', unicode_errors='strict'): + """ + Load the input-hidden weight matrix from the original C word2vec-tool format. + + Note that the information stored in the file is incomplete (the binary tree is missing), + so while you can query for word similarity etc., you cannot continue training + with a model loaded this way. + + `binary` is a boolean indicating whether the data is in binary word2vec format. + `norm_only` is a boolean indicating whether to only store normalised word2vec vectors in memory. + Word counts are read from `fvocab` filename, if set (this is the file generated + by `-save-vocab` flag of the original C tool). + + If you trained the C model using non-utf8 encoding for words, specify that + encoding in `encoding`. + + """ + counts = None + if fvocab is not None: + logger.info("loading word counts from %s", fvocab) + counts = {} + with utils.smart_open(fvocab) as fin: + for line in fin: + word, count = utils.to_unicode(line).strip().split() + counts[word] = int(count) + + logger.info("loading projection weights from %s", fname) + with utils.smart_open(fname) as fin: + header = utils.to_unicode(fin.readline(), encoding=encoding) + vocab_size, vector_size = map(int, header.split()) # throws for invalid file format + result = cls(size=vector_size) + result.syn0 = zeros((vocab_size, vector_size), dtype=REAL) + + def add_word(word, weights): + word_id = len(result.vocab) + if word in result.vocab: + logger.warning("duplicate word '%s' in %s, ignoring all but first", word, fname) + return + if counts is None: + # most common scenario: no vocab file given. just make up some bogus counts, in descending order + result.vocab[word] = Vocab(index=word_id, count=vocab_size - word_id) + elif word in counts: + # use count from the vocab file + result.vocab[word] = Vocab(index=word_id, count=counts[word]) + else: + # vocab file given, but word is missing -- set count to None (TODO: or raise?) + logger.warning("vocabulary file is incomplete: '%s' is missing", word) + result.vocab[word] = Vocab(index=word_id, count=None) + result.syn0[word_id] = weights + result.index2word.append(word) + + if binary: + binary_len = dtype(REAL).itemsize * vector_size + for line_no in xrange(vocab_size): + # mixed text and binary: read text first, then binary + word = [] + while True: + ch = fin.read(1) + if ch == b' ': + break + if ch != b'\n': # ignore newlines in front of words (some binary files have) + word.append(ch) + word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) + weights = fromstring(fin.read(binary_len), dtype=REAL) + add_word(word, weights) + else: + for line_no, line in enumerate(fin): + parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") + if len(parts) != vector_size + 1: + raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) + word, weights = parts[0], list(map(REAL, parts[1:])) + add_word(word, weights) + if result.syn0.shape[0] != len(result.vocab): + logger.info( + "duplicate words detected, shrinking matrix size from %i to %i", + result.syn0.shape[0], len(result.vocab) + ) + result.syn0 = ascontiguousarray(result.syn0[: len(result.vocab)]) + assert (len(result.vocab), result.vector_size) == result.syn0.shape + + logger.info("loaded %s matrix from %s" % (result.syn0.shape, fname)) + return result + + def intersect_word2vec_format(self, fname, binary=False, encoding='utf8', unicode_errors='strict'): + """ + Merge the input-hidden weight matrix from the original C word2vec-tool format + given, where it intersects with the current vocabulary. (No words are added to the + existing vocabulary, but intersecting words adopt the file's weights, and + non-intersecting words are left alone.) + + `binary` is a boolean indicating whether the data is in binary word2vec format. + """ + overlap_count = 0 + logger.info("loading projection weights from %s" % (fname)) + with utils.smart_open(fname) as fin: + header = utils.to_unicode(fin.readline(), encoding=encoding) + vocab_size, vector_size = map(int, header.split()) # throws for invalid file format + if not vector_size == self.vector_size: + raise ValueError("incompatible vector size %d in file %s" % (vector_size, fname)) + # TOCONSIDER: maybe mismatched vectors still useful enough to merge (truncating/padding)? + if binary: + binary_len = dtype(REAL).itemsize * vector_size + for line_no in xrange(vocab_size): + # mixed text and binary: read text first, then binary + word = [] + while True: + ch = fin.read(1) + if ch == b' ': + break + if ch != b'\n': # ignore newlines in front of words (some binary files have) + word.append(ch) + word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) + weights = fromstring(fin.read(binary_len), dtype=REAL) + if word in self.vocab: + overlap_count += 1 + self.syn0[self.vocab[word].index] = weights + self.syn0_lockf[self.vocab[word].index] = 0.0 # lock it + else: + for line_no, line in enumerate(fin): + parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") + if len(parts) != vector_size + 1: + raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) + word, weights = parts[0], list(map(REAL, parts[1:])) + if word in self.vocab: + overlap_count += 1 + self.syn0[self.vocab[word].index] = weights + logger.info("merged %d vectors into %s matrix from %s" % (overlap_count, self.syn0.shape, fname)) + + def most_similar(self, positive=[], negative=[], topn=10, restrict_vocab=None): + """ + Find the top-N most similar words. Positive words contribute positively towards the + similarity, negative words negatively. + + This method computes cosine similarity between a simple mean of the projection + weight vectors of the given words and the vectors for each word in the model. + The method corresponds to the `word-analogy` and `distance` scripts in the original + word2vec implementation. + + If topn is False, most_similar 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.most_similar(positive=['woman', 'king'], negative=['man']) + [('queen', 0.50882536), ...] + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar('dog'), as a shorthand for most_similar(['dog']) + positive = [positive] + + # add weights for each word, if not already present; default to 1.0 for positive and -1.0 for negative words + positive = [ + (word, 1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in positive + ] + negative = [ + (word, -1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in negative + ] + + # compute the weighted average of all words + all_words, mean = set(), [] + for word, weight in positive + negative: + if isinstance(word, ndarray): + mean.append(weight * word) + elif word in self.vocab: + mean.append(weight * self.syn0norm[self.vocab[word].index]) + all_words.add(self.vocab[word].index) + else: + raise KeyError("word '%s' not in vocabulary" % word) + if not mean: + raise ValueError("cannot compute similarity with no input") + mean = matutils.unitvec(array(mean).mean(axis=0)).astype(REAL) + + limited = self.syn0norm if restrict_vocab is None else self.syn0norm[:restrict_vocab] + dists = dot(limited, mean) + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] + return result[:topn] + + def wmdistance(self, document1, document2, WCD=False, RWMD=False): + """ + Compute the Word Mover's Distance between two documents. When using this + code, please consider citing the following papers: + * Ofir Pele and Michael Werman, "A linear time histogram metric for improved SIFT matching". + * Ofir Pele and Michael Werman, "Fast and robust earth mover's distances". + * Matt Kusner et al. "From Word Embeddings To Document Distances". + + Note that if one of the documents have no words that exist in the + Word2Vec vocab, `float('inf')` (i.e. infinity) will be returned. + + This method only works if `pyemd` is installed (can be installed via pip, but requires a C compiler). + + Example: + > # Train word2vec model. + > model = Word2Vec(sentences) + + > # Some sentences to test. + > sentence_obama = 'Obama speaks to the media in Illinois'.lower().split() + > sentence_president = 'The president greets the press in Chicago'.lower().split() + + > # Remove their stopwords. + > from nltk.corpus import stopwords + > stopwords = nltk.corpus.stopwords.words('english') + > sentence_obama = [w for w in sentence_obama if w not in stopwords] + > sentence_president = [w for w in sentence_president if w not in stopwords] + + > # Compute WMD. + > distance = model.wmdistance(sentence_obama, sentence_president) + """ + + if not PYEMD_EXT: + raise ImportError("Please install pyemd Python package to compute WMD.") + + # Remove out-of-vocabulary words. + len_pre_oov1 = len(document1) + len_pre_oov2 = len(document2) + document1 = [token for token in document1 if token in self] + document2 = [token for token in document2 if token in self] + diff1 = len_pre_oov1 - len(document1) + diff2 = len_pre_oov2 - len(document2) + if diff1 > 0 or diff2 > 0: + logger.info('Removed %d and %d OOV words from document 1 and 2 (respectively).', + diff1, diff2) + + if len(document1) == 0 or len(document2) == 0: + logger.info('At least one of the documents had no words that were' + 'in the vocabulary. Aborting (returning inf).') + return float('inf') + + dictionary = Dictionary(documents=[document1, document2]) + vocab_len = len(dictionary) + + # Sets for faster look-up. + docset1 = set(document1) + docset2 = set(document2) + + # Compute distance matrix. + distance_matrix = zeros((vocab_len, vocab_len), dtype=double) + for i, t1 in dictionary.items(): + for j, t2 in dictionary.items(): + if not t1 in docset1 or not t2 in docset2: + continue + # Compute Euclidean distance between word vectors. + distance_matrix[i, j] = sqrt(np_sum((self[t1] - self[t2])**2)) + + if np_sum(distance_matrix) == 0.0: + # `emd` gets stuck if the distance matrix contains only zeros. + logger.info('The distance matrix is all zeros. Aborting (returning inf).') + return float('inf') + + def nbow(document): + d = zeros(vocab_len, dtype=double) + nbow = dictionary.doc2bow(document) # Word frequencies. + doc_len = len(document) + for idx, freq in nbow: + d[idx] = freq / float(doc_len) # Normalized word frequencies. + return d + + # Compute nBOW representation of documents. + d1 = nbow(document1) + d2 = nbow(document2) + + # Compute WMD. + return emd(d1, d2, distance_matrix) + + def most_similar_cosmul(self, positive=[], negative=[], topn=10): + """ + Find the top-N most similar words, using the multiplicative combination objective + proposed by Omer Levy and Yoav Goldberg in [4]_. Positive words still contribute + positively towards the similarity, negative words negatively, but with less + susceptibility to one large distance dominating the calculation. + + In the common analogy-solving case, of two positive and one negative examples, + this method is equivalent to the "3CosMul" objective (equation (4)) of Levy and Goldberg. + + Additional positive or negative examples contribute to the numerator or denominator, + respectively – a potentially sensible but untested extension of the method. (With + a single positive example, rankings will be the same as in the default most_similar.) + + Example:: + + >>> trained_model.most_similar_cosmul(positive=['baghdad', 'england'], negative=['london']) + [(u'iraq', 0.8488819003105164), ...] + + .. [4] Omer Levy and Yoav Goldberg. Linguistic Regularities in Sparse and Explicit Word Representations, 2014. + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar_cosmul('dog'), as a shorthand for most_similar_cosmul(['dog']) + positive = [positive] + + all_words = set() + + def word_vec(word): + if isinstance(word, ndarray): + return word + elif word in self.vocab: + all_words.add(self.vocab[word].index) + return self.syn0norm[self.vocab[word].index] + else: + raise KeyError("word '%s' not in vocabulary" % word) + + positive = [word_vec(word) for word in positive] + negative = [word_vec(word) for word in negative] + if not positive: + raise ValueError("cannot compute similarity with no input") + + # equation (4) of Levy & Goldberg "Linguistic Regularities...", + # with distances shifted to [0,1] per footnote (7) + pos_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in positive] + neg_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in negative] + dists = prod(pos_dists, axis=0) / (prod(neg_dists, axis=0) + 0.000001) + + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + 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? + + Example:: + + >>> trained_model.doesnt_match("breakfast cereal dinner lunch".split()) + 'cereal' + + """ + self.init_sims() + + words = [word for word in words if word in self.vocab] # filter out OOV words + logger.debug("using words %s" % words) + if not words: + raise ValueError("cannot select a word from an empty list") + vectors = vstack(self.syn0norm[self.vocab[word].index] for word in words).astype(REAL) + mean = matutils.unitvec(vectors.mean(axis=0)).astype(REAL) + dists = dot(vectors, mean) + return sorted(zip(dists, words))[0][1] + + 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.syn0[self.vocab[words].index] + + return vstack([self.syn0[self.vocab[word].index] for word in words]) + + def __contains__(self, word): + return word in self.vocab + + def similarity(self, w1, w2): + """ + Compute cosine similarity between two words. + + Example:: + + >>> trained_model.similarity('woman', 'man') + 0.73723527 + + >>> trained_model.similarity('woman', 'woman') + 1.0 + + """ + return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2])) + + def n_similarity(self, ws1, ws2): + """ + Compute cosine similarity between two sets of words. + + Example:: + + >>> trained_model.n_similarity(['sushi', 'shop'], ['japanese', 'restaurant']) + 0.61540466561049689 + + >>> trained_model.n_similarity(['restaurant', 'japanese'], ['japanese', 'restaurant']) + 1.0000000000000004 + + >>> trained_model.n_similarity(['sushi'], ['restaurant']) == trained_model.similarity('sushi', 'restaurant') + True + + """ + v1 = [self[word] for word in ws1] + v2 = [self[word] for word in ws2] + return dot(matutils.unitvec(array(v1).mean(axis=0)), matutils.unitvec(array(v2).mean(axis=0))) + + def init_sims(self, replace=False): + """ + Precompute L2-normalized vectors. + + If `replace` is set, forget the original vectors and only keep the normalized + ones = saves lots of memory! + + Note that you **cannot continue training** after doing a replace. The model becomes + effectively read-only = you can call `most_similar`, `similarity` etc., but not `train`. + + """ + if getattr(self, 'syn0norm', None) is None or replace: + logger.info("precomputing L2-norms of word weight vectors") + if replace: + for i in xrange(self.syn0.shape[0]): + self.syn0[i, :] /= sqrt((self.syn0[i, :] ** 2).sum(-1)) + self.syn0norm = self.syn0 + if hasattr(self, 'syn1'): + del self.syn1 + else: + self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL) + + def estimate_memory(self, vocab_size=None, report=None): + """Estimate required memory for a model using current settings and provided vocabulary size.""" + vocab_size = vocab_size or len(self.vocab) + report = report or {} + report['vocab'] = vocab_size * (700 if self.hs else 500) + report['syn0'] = vocab_size * self.vector_size * dtype(REAL).itemsize + if self.hs: + report['syn1'] = vocab_size * self.layer1_size * dtype(REAL).itemsize + if self.negative: + report['syn1neg'] = vocab_size * self.layer1_size * dtype(REAL).itemsize + report['total'] = sum(report.values()) + logger.info("estimated required memory for %i words and %i dimensions: %i bytes", + vocab_size, self.vector_size, report['total']) + return report + + @staticmethod + def log_accuracy(section): + correct, incorrect = len(section['correct']), len(section['incorrect']) + if correct + incorrect > 0: + logger.info("%s: %.1f%% (%i/%i)" % + (section['section'], 100.0 * correct / (correct + incorrect), + correct, correct + incorrect)) + + def accuracy(self, questions, restrict_vocab=30000, most_similar=most_similar, use_lowercase=True): + """ + Compute accuracy of the model. `questions` is a filename where lines are + 4-tuples of words, split into sections by ": SECTION NAME" lines. + See questions-words.txt in https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/word2vec/source-archive.zip for an example. + + The accuracy is reported (=printed to log and returned as a list) for each + section separately, plus there's one aggregate summary at the end. + + Use `restrict_vocab` to ignore all questions containing a word whose frequency + is not in the top-N most frequent words (default top 30,000). + + Use `use_lowercase` to convert all words in questions to thier lowercase form before evaluating + the accuracy. It's useful when assuming the text preprocessing also uses lowercase. (default True). + + This method corresponds to the `compute-accuracy` script of the original C word2vec. + + """ + ok_vocab = dict(sorted(iteritems(self.vocab), + key=lambda item: -item[1].count)[:restrict_vocab]) + ok_index = set(v.index for v in itervalues(ok_vocab)) + + sections, section = [], None + for line_no, line in enumerate(utils.smart_open(questions)): + # TODO: use level3 BLAS (=evaluate multiple questions at once), for speed + line = utils.to_unicode(line) + if line.startswith(': '): + # a new section starts => store the old section + if section: + sections.append(section) + self.log_accuracy(section) + section = {'section': line.lstrip(': ').strip(), 'correct': [], 'incorrect': []} + else: + if not section: + raise ValueError("missing section header before line #%i in %s" % (line_no, questions)) + try: + if use_lowercase: + a, b, c, expected = [word.lower() for word in line.split()] # assumes vocabulary preprocessing uses lowercase, too... + else: + a, b, c, expected = [word for word in line.split()] + except: + logger.info("skipping invalid line #%i in %s" % (line_no, questions)) + if a not in ok_vocab or b not in ok_vocab or c not in ok_vocab or expected not in ok_vocab: + logger.debug("skipping line #%i with OOV words: %s" % (line_no, line.strip())) + continue + + ignore = set(self.vocab[v].index for v in [a, b, c]) # indexes of words to ignore + predicted = None + # find the most likely prediction, ignoring OOV words and input words + sims = most_similar(self, positive=[b, c], negative=[a], topn=False, restrict_vocab=restrict_vocab) + for index in matutils.argsort(sims, reverse=True): + if index in ok_index and index not in ignore: + predicted = self.index2word[index] + if predicted != expected: + logger.debug("%s: expected %s, predicted %s", line.strip(), expected, predicted) + break + if predicted == expected: + section['correct'].append((a, b, c, expected)) + else: + section['incorrect'].append((a, b, c, expected)) + if section: + # store the last section, too + sections.append(section) + self.log_accuracy(section) + + total = { + 'section': 'total', + 'correct': sum((s['correct'] for s in sections), []), + 'incorrect': sum((s['incorrect'] for s in sections), []), + } + self.log_accuracy(total) + sections.append(total) + return sections + + def __str__(self): + return "%s(vocab=%s, size=%s, alpha=%s)" % (self.__class__.__name__, len(self.index2word), self.vector_size, self.alpha) + + def save(self, *args, **kwargs): + # don't bother storing the cached normalized vectors, recalculable table + kwargs['ignore'] = kwargs.get('ignore', ['syn0norm', 'table', 'cum_table']) + super(Word2Vec, self).save(*args, **kwargs) + + save.__doc__ = utils.SaveLoad.save.__doc__ + + @classmethod + def load(cls, *args, **kwargs): + model = super(Word2Vec, cls).load(*args, **kwargs) + # update older models + if hasattr(model, 'table'): + delattr(model, 'table') # discard in favor of cum_table + if model.negative and hasattr(model, 'index2word'): + model.make_cum_table() # rebuild cum_table from vocabulary + if not hasattr(model, 'corpus_count'): + model.corpus_count = None + for v in model.vocab.values(): + if hasattr(v, 'sample_int'): + break # already 0.12.0+ style int probabilities + elif hasattr(v, 'sample_probability'): + v.sample_int = int(round(v.sample_probability * 2**32)) + del v.sample_probability + if not hasattr(model, 'syn0_lockf') and hasattr(model, 'syn0'): + model.syn0_lockf = ones(len(model.syn0), dtype=REAL) + if not hasattr(model, 'random'): + model.random = random.RandomState(model.seed) + if not hasattr(model, 'train_count'): + model.train_count = 0 + model.total_train_time = 0 + return model + + +class BrownCorpus(object): + """Iterate over sentences from the Brown corpus (part of NLTK data).""" + def __init__(self, dirname): + self.dirname = dirname + + def __iter__(self): + for fname in os.listdir(self.dirname): + fname = os.path.join(self.dirname, fname) + if not os.path.isfile(fname): + continue + for line in utils.smart_open(fname): + line = utils.to_unicode(line) + # each file line is a single sentence in the Brown corpus + # each token is WORD/POS_TAG + token_tags = [t.split('/') for t in line.split() if len(t.split('/')) == 2] + # ignore words with non-alphabetic tags like ",", "!" etc (punctuation, weird stuff) + words = ["%s/%s" % (token.lower(), tag[:2]) for token, tag in token_tags if tag[:2].isalpha()] + if not words: # don't bother sending out empty sentences + continue + yield words + + +class Text8Corpus(object): + """Iterate over sentences from the "text8" corpus, unzipped from http://mattmahoney.net/dc/text8.zip .""" + def __init__(self, fname, max_sentence_length=MAX_WORDS_IN_BATCH): + self.fname = fname + self.max_sentence_length = max_sentence_length + + def __iter__(self): + # the entire corpus is one gigantic line -- there are no sentence marks at all + # so just split the sequence of tokens arbitrarily: 1 sentence = 1000 tokens + sentence, rest = [], b'' + with utils.smart_open(self.fname) as fin: + while True: + text = rest + fin.read(8192) # avoid loading the entire file (=1 line) into RAM + if text == rest: # EOF + sentence.extend(rest.split()) # return the last chunk of words, too (may be shorter/longer) + if sentence: + yield sentence + break + last_token = text.rfind(b' ') # last token may have been split in two... keep for next iteration + words, rest = (utils.to_unicode(text[:last_token]).split(), + text[last_token:].strip()) if last_token >= 0 else ([], text) + sentence.extend(words) + while len(sentence) >= self.max_sentence_length: + yield sentence[:self.max_sentence_length] + sentence = sentence[self.max_sentence_length:] + + +class LineSentence(object): + """ + Simple format: one sentence = one line; words already preprocessed and separated by whitespace. + """ + + def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None): + """ + `source` can be either a string or a file object. Clip the file to the first + `limit` lines (or no clipped if limit is None, the default). + + Example:: + + sentences = LineSentence('myfile.txt') + + Or for compressed files:: + + sentences = LineSentence('compressed_text.txt.bz2') + sentences = LineSentence('compressed_text.txt.gz') + + """ + self.source = source + self.max_sentence_length = max_sentence_length + self.limit = limit + + def __iter__(self): + """Iterate through the lines in the source.""" + try: + # Assume it is a file-like object and try treating it as such + # Things that don't have seek will trigger an exception + self.source.seek(0) + for line in itertools.islice(self.source, self.limit): + line = utils.to_unicode(line).split() + i = 0 + while i < len(line): + yield line[i : i + self.max_sentence_length] + i += self.max_sentence_length + except AttributeError: + # If it didn't work like a file, use it as a string filename + with utils.smart_open(self.source) as fin: + for line in itertools.islice(fin, self.limit): + line = utils.to_unicode(line).split() + i = 0 + while i < len(line): + yield line[i : i + self.max_sentence_length] + i += self.max_sentence_length + + +# Example: ./word2vec.py -train data.txt -output vec.txt -size 200 -window 5 -sample 1e-4 -negative 5 -hs 0 -binary 0 -cbow 1 -iter 3 +if __name__ == "__main__": + import argparse + logging.basicConfig( + format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', + level=logging.INFO) + logging.info("running %s", " ".join(sys.argv)) + logging.info("using optimization %s", FAST_VERSION) + + # check and process cmdline input + program = os.path.basename(sys.argv[0]) + if len(sys.argv) < 2: + print(globals()['__doc__'] % locals()) + sys.exit(1) + + from gensim.models.word2vec import Word2Vec # avoid referencing __main__ in pickle + + seterr(all='raise') # don't ignore numpy errors + + parser = argparse.ArgumentParser() + parser.add_argument("-train", help="Use text data from file TRAIN to train the model", required=True) + parser.add_argument("-output", help="Use file OUTPUT to save the resulting word vectors") + parser.add_argument("-window", help="Set max skip length WINDOW between words; default is 5", type=int, default=5) + parser.add_argument("-size", help="Set size of word vectors; default is 100", type=int, default=100) + parser.add_argument("-sample", help="Set threshold for occurrence of words. Those that appear with higher frequency in the training data will be randomly down-sampled; default is 1e-3, useful range is (0, 1e-5)", type=float, default=1e-3) + parser.add_argument("-hs", help="Use Hierarchical Softmax; default is 0 (not used)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-negative", help="Number of negative examples; default is 5, common values are 3 - 10 (0 = not used)", type=int, default=5) + parser.add_argument("-threads", help="Use THREADS threads (default 12)", type=int, default=12) + parser.add_argument("-iter", help="Run more training iterations (default 5)", type=int, default=5) + parser.add_argument("-min_count", help="This will discard words that appear less than MIN_COUNT times; default is 5", type=int, default=5) + parser.add_argument("-cbow", help="Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)", type=int, default=1, choices=[0, 1]) + parser.add_argument("-binary", help="Save the resulting vectors in binary mode; default is 0 (off)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-accuracy", help="Use questions from file ACCURACY to evaluate the model") + + args = parser.parse_args() + + if args.cbow == 0: + skipgram = 1 + else: + skipgram = 0 + + corpus = LineSentence(args.train) + + model = Word2Vec( + corpus, size=args.size, min_count=args.min_count, workers=args.threads, + window=args.window, sample=args.sample, sg=skipgram, hs=args.hs, + negative=args.negative, cbow_mean=1, iter=args.iter) + + if args.output: + outfile = args.output + model.save_word2vec_format(outfile, binary=args.binary) + else: + outfile = args.train + model.save(outfile + '.model') + if args.binary == 1: + model.save_word2vec_format(outfile + '.model.bin', binary=True) + else: + model.save_word2vec_format(outfile + '.model.txt', binary=False) + + if args.accuracy: + model.accuracy(args.accuracy) + + logger.info("finished running %s", program) diff --git a/tutorials.md b/tutorials.md new file mode 100644 index 0000000000..80453b6e77 --- /dev/null +++ b/tutorials.md @@ -0,0 +1,96 @@ + +###Tutorials + +#####Quick-start +* [Getting Started with gensim](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/gensim%20Quick%20Start.ipynb) + +#####Text to Vectors +* We first need to transform text to vectors +* [String to vectors tutorial](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/Corpora_and_Vector_Spaces.ipynb) + * Create a dictionary first that maps words to ids + * Transform the text into vectors through ```dictionary.doc2bow(texts)``` +* [Corpus streaming tutorial](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/Corpora_and_Vector_Spaces.ipynb) (For very large corpuses) + +#####Models and Transformation +* Models (e.g. LsiModel, Word2Vec) are built / trained from a corpus +* [Transformation interface tutorial](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/Topics_and_Transformations.ipynb) + +#####TF-IDF (Model) +* [Docs](https://radimrehurek.com/gensim/models/tfidfmodel.html), [Source](https://github.com/piskvorky/gensim/blob/develop/gensim/models/tfidfmodel.py) +* [tf-idf scores are normalized](http://stackoverflow.com/questions/9470479/how-is-tf-idf-implemented-in-gensim-tool-in-python) (sum of squares of scores = 1) + +#####Phrases (Model) +* Detects words that belong in a phrase, useful for models like Word2Vec ("new", "york" -> "new york") +* [Docs](https://radimrehurek.com/gensim/models/phrases.html), [Source](https://github.com/piskvorky/gensim/blob/develop/gensim/models/phrases.py) (uses bigram detectors underneath) +* [Phrases example on How I Met Your Mother](http://www.markhneedham.com/blog/2015/02/12/pythongensim-creating-bigrams-over-how-i-met-your-mother-transcripts/) + +####Topic Modeling + +#####LSI (Model) +* [Docs](https://radimrehurek.com/gensim/models/lsimodel.html), [Source](https://github.com/piskvorky/gensim/blob/develop/gensim/models/lsimodel.py) (very standard LSI implementation) +* [How to interpret negative LSI values](https://www.researchgate.net/post/LSA_SVD_How_to_statistically_interpret_negative_values_in_U_and_Vt) +* [Random Projection](https://radimrehurek.com/gensim/models/rpmodel.html) (used as an option to speed up LSI) + +#####LDA (Model) +* [Docs](https://radimrehurek.com/gensim/models/ldamodel.html), [Source](https://github.com/piskvorky/gensim/blob/develop/gensim/models/ldamodel.py) +* [Example with Android issue reports](http://christop.club/2014/05/06/using-gensim-for-lda/), [Another example](https://rstudio-pubs-static.s3.amazonaws.com/79360_850b2a69980c4488b1db95987a24867a.html), [Another example](http://brandonrose.org/clustering#Latent-Dirichlet-Allocation) + +#####Topic Model Tuning +* [Colouring words by topic in a document, print words in a topics](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/topic_methods.ipynb) +* [Topic Coherence, a metric that correlates that human judgement on topic quality.](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/topic_coherence_tutorial.ipynb) +* [Compare topics and documents using Jaccard, Kullback-Leibler and Hellinger similarities] (https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/similarity_metrics.ipynb) + +#####Query Similarities +* Tool to get the most similar documents for LDA, LSI +* [Similarity queries tutorial](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/Similarity_Queries.ipynb) + +#####Dynamic Topic Modeling +* Model evolution of topics through time +* [Easy intro to DTM. Evolution of Voldemort topic through the 7 Harry Potter books.](http://rare-technologies.com/understanding-and-coding-dynamic-topic-models/) +* [Dynamic Topic Modeling and Dynamic Influence Model Tutorial](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/dtm_example.ipynb) + + +####Word Embeddings + +#####Word2Vec (Model) +* [Docs](https://radimrehurek.com/gensim/models/word2vec.html), [Source](https://github.com/piskvorky/gensim/blob/develop/gensim/models/word2vec.py) (very simple interface) +* [Simple word2vec tutorial](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/word2vec.ipynb) (examples of ```most_similar, similarity, doesnt_match```) + +#####Doc2Vec (Model) +* [Doc2vec Quick Start on Lee Corpus](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-lee.ipynb) +* [Docs](https://radimrehurek.com/gensim/models/doc2vec.html), [Source](https://github.com/piskvorky/gensim/blob/develop/gensim/models/doc2vec.py) (Docs are not very good) +* Doc2Vec requires a non-standard corpus (need sentiment label for each document) +* [Great illustration of corpus preparation](https://linanqiu.github.io/2015/10/07/word2vec-sentiment/), [Code](https://github.com/linanqiu/word2vec-sentiments) ([Alternative](https://medium.com/@klintcho/doc2vec-tutorial-using-gensim-ab3ac03d3a1#.nv2lxvbj1), [Alternative 2](https://districtdatalabs.silvrback.com/modern-methods-for-sentiment-analysis)) +* [Doc2Vec on customer review](http://multithreaded.stitchfix.com/blog/2015/03/11/word-is-worth-a-thousand-vectors/) (example) +* [Doc2vec to predict IMDB review star rating. Reproducing the Google paper](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb) + +#####Word Movers Distance +* Tool to get the most similar documents for word2vec +* [Word Movers Distance for Yelp Reviews tutorial](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/WMD_tutorial.ipynb) + +#####Deep Inverse Regression +* Document Classification using Bayesian Inversion and several word2vec models(one for each class) +* [Deep Inverse Regression with Yelp Reviews](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/deepir.ipynb) + + +####Other techniques + +#####Summarization +* Extract most important keywords and sentences from the text +* [Tutorial on TextRank summarisation](https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/summarization_tutorial.ipynb) + +#####Overviews +* Tutorial showing API for document classification with various techniques: TF-IDF, word2vec averaging, Deep IR, Word Movers Distance and doc2vec +* [Movie plots by genre](https://github.com/RaRe-Technologies/movie-plots-by-genre) + + +###Videos +* [Radim Řehůřek - Faster than Google? Optimization lessons in Python.](https://www.youtube.com/watch?v=vU4TlwZzTfU) +* [MLMU.cz - Radim Řehůřek - Word2vec & friends (7.1.2015)](https://www.youtube.com/watch?v=wTp3P2UnTfQ) +* [Making an Impact with NLP](https://www.youtube.com/watch?v=oSSnDeOXTZQ) -- Pycon 2016 Tutorial by Hobsons Lane +* [NLP with NLTK and Gensim](https://www.youtube.com/watch?v=itKNpCPHq3I) -- Pycon 2016 Tutorial by Tony Ojeda, Benjamin Bengfort, Laura Lorenz from District Data Labs +* [Word Embeddings for Fun and Profit](https://www.youtube.com/watch?v=lfqW46u0UKc) -- Talk at PyData London 2016 talk by Lev Konstantinovskiy. See accompanying [repo](https://github.com/RaRe-Technologies/movie-plots-by-genre) + +#Credits +Based on wonderful [resource](https://github.com/jxieeducation/DIY-Data-Science/blob/master/frameworks/gensim.md) by Jason Xie. + From f3f2a5210b3ab6266b5070d59491ac09af651e7e Mon Sep 17 00:00:00 2001 From: Nowow Date: Sat, 2 Jul 2016 22:04:18 +0300 Subject: [PATCH 29/33] 'fisrt_push' --- syntax_model_files/README.md | 1 + syntax_model_files/gen_iter.py | 181 + .../gensim/models/compile_cython.py | 13 + .../gensim/models/word2vec_inner_synt.c | 13117 ++++++++++++++++ .../gensim/models/word2vec_inner_synt.pyx | 679 + .../gensim/models/word2vec_synt.py | 1667 ++ syntax_model_files/script_to_model.py | 90 + syntax_model_files/sdasd.txt | 0 syntax_model_files/syntax_model | Bin 0 -> 6214111 bytes 9 files changed, 15748 insertions(+) create mode 100644 syntax_model_files/README.md create mode 100644 syntax_model_files/gen_iter.py create mode 100644 syntax_model_files/gensim/models/compile_cython.py create mode 100644 syntax_model_files/gensim/models/word2vec_inner_synt.c create mode 100644 syntax_model_files/gensim/models/word2vec_inner_synt.pyx create mode 100644 syntax_model_files/gensim/models/word2vec_synt.py create mode 100644 syntax_model_files/script_to_model.py create mode 100644 syntax_model_files/sdasd.txt create mode 100644 syntax_model_files/syntax_model diff --git a/syntax_model_files/README.md b/syntax_model_files/README.md new file mode 100644 index 0000000000..ca89a0a4bf --- /dev/null +++ b/syntax_model_files/README.md @@ -0,0 +1 @@ +# word2vec_syntax \ No newline at end of file diff --git a/syntax_model_files/gen_iter.py b/syntax_model_files/gen_iter.py new file mode 100644 index 0000000000..c53d111702 --- /dev/null +++ b/syntax_model_files/gen_iter.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue May 24 22:43:11 2016 + +@author: robert +""" + +#TWEAK TIME + +import pickle +import os +import re +# use nltk.download() to download stopwords corpus if not yet + + + + +# Iterable to be passed to word2vec class as sentences. +# reads sentences one by one from picke dump + + + +#stops = set(stopwords.words('russian')) + +stops = ['чтоб', 'между', 'какой', 'без', 'но', 'чуть', 'для', 'не', 'куда', + 'себя', 'всего', 'даже', 'был', 'кто', 'уж', 'только', 'с', 'быть', + 'теперь', 'много', 'по', 'надо', 'когда', 'этого', + 'три', 'и', 'опять', 'или', 'под', 'более', 'эти', 'бы', 'чем', + 'совсем', 'сам', 'раз', 'хоть', 'нибудь', 'него', 'уже', 'сейчас', + 'никогда', 'о', 'ни', 'можно', 'ли', 'потому', 'тем', 'будто', + 'в', 'перед', 'так', 'два', 'ничего', 'а', 'почти', 'может', + 'было', 'эту', 'их', 'нет', 'впрочем', 'им', 'во', 'лучше', + 'до', 'про', 'вот', 'после', 'что', 'зачем', 'иногда', + 'ее', 'другой', 'больше', 'тоже', 'еще', 'от', 'у', 'потом', 'всю', + 'над', 'этой', 'за', 'если', 'ж', 'там', 'есть', + 'через', 'из', 'как', 'на', 'чтобы', 'такой', 'том', + 'да', 'этом', 'хорошо', 'к', 'при', 'были', 'себе', + 'чего', 'ней', 'то', 'вам', 'один', 'вдруг', 'со', + 'тогда', 'будет', 'разве', 'нельзя', 'наконец', 'ведь', 'здесь', + 'тот', 'какая', 'этот', 'же', 'где', 'ну', 'конечно', + 'того', 'тут', 'была', 'всегда', 'свою', 'об', 'всех'] + +# futureStops = ['кто', 'что'] + + +# Looping over the corpus and generating pickle dump file that would give off +# context pairs one by one + +def createContext(root_directory): + + pickleDump = open('/run/media/robert/1TB-1/linuxfolder/pythonworks/contDumpFinal', 'ab') + dumpCounter = 0 + +# walking the corpus dir +# files walked linewise + + + for root, dirs, files in os.walk(root_directory): + for fname in filter(lambda fname: fname.endswith('.conll'), files): + + + document = open(os.path.join(root, fname), 'r') + print('Opened document ' + fname) + + + wordCounter = -1 + sentDict = {} + sentCash = [] + for line in document: + + if len(line)<5: + continue + line = line.lower() + line = line.split() + # Creating cash dictionary for sentence + + wordCounter += 1 + if wordCounter < int(line[0]): + + if re.match('[A-Za-zА-Яа-я]+$', line[2]) != None: + sentDict.update({line[0]:{'word':line[2],'ref':line[6]}}) + + + else: + sentDict.update({line[0]:{'word':None,'ref':line[6]}}) + + + else: + wordCounter = 0 + # Creating a sentence (context pair) to be passed to word2vec later + for slot in sentDict: + if sentDict[slot]['word'] == None: + continue + if sentDict[slot]['word'] in stops: + + continue + sentCash.append(sentDict[slot]['word']) # append target word if it is okay + # looking into word that's higher in hyerarchy + if (sentDict[slot]['ref'] != 0 and sentDict[slot]['ref'] != '0'): + wordRef = sentDict[slot]['ref'] + refCounter = 0 + while refCounter < 10: + refCounter += 1 + + #cycling through dependent word chain until good word fould or 10 tries + + + try: + if sentDict[wordRef]['word'] in stops: + + wordRef = sentDict[wordRef]['ref'] + + else: + refCounter = 10 + + try: + + sentCash.append(sentDict[sentDict[slot]['ref']]['word']) + # print(sentCash) + + except: + continue + except: + pass + # looking into dependent words + # cycling through all words in a sentence again + for slot2 in sentDict: + if sentDict[slot2]['ref'] == slot: + if sentDict[slot2]['word'] != None: + if re.match('[A-Za-zА-Яа-я]+$', sentDict[slot2]['word']) != None: + if sentDict[slot2]['word'] not in stops: + sentCash.append(sentDict[slot2]['word']) + # if okay, stop here +# + if (sentDict[slot2]['word'] == None) or (sentDict[slot2]['word'] in stops): + checkedSlot = slot2 + slotCounter = 0 + while slotCounter < 10: +# print('SPASITE2') + slotCounter += 1 + for slot3 in sentDict: + if sentDict[slot3]['ref'] == checkedSlot: + + if (sentDict[slot3]['word'] == None) or (sentDict[slot3]['word'] in stops): +# print(str(sentDict[slot3]['word']) + ' is BAD WORD FROM SECOND CYCLE!') + checkedSlot = slot3 + slotCounter += 1 + else: + # print(sentDict[slot3]['word'] + ' is a GOOD WORD FROM SECOND CYCLE!') + sentCash.append(sentDict[slot3]['word']) + slotCounter = 10 + # veryfying no stopwords slipped + for k in filter(lambda k: k in stops, sentCash): + sentCash.remove(k) + if len(sentCash) > 1: +# print('Dumping.....') + pickle.dump(sentCash,pickleDump) + #pickling to a file + dumpCounter += 1 + sentCash = [] + sentDict = {} + if re.match('[A-Za-zА-Яа-я]+$', line[2]) != None: + sentDict.update({line[0]:{'word':line[2],'ref':line[6]}}) + else: + sentDict.update({line[0]:{'word':None,'ref':line[6]}}) + + pickleDump.close() + return(dumpCounter) + + + + + + + + + + + + + diff --git a/syntax_model_files/gensim/models/compile_cython.py b/syntax_model_files/gensim/models/compile_cython.py new file mode 100644 index 0000000000..00b9f05532 --- /dev/null +++ b/syntax_model_files/gensim/models/compile_cython.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Jun 12 21:01:49 2016 + +@author: robert +""" + +from distutils.core import setup +from Cython.Build import cythonize +import numpy + + +setup(ext_modules=cythonize('/run/media/robert/1TB-1/linuxfolder/anaconda3/lib/python3.5/site-packages/gensim/models/word2vec_inner_synt2.pyx'), include_dirs=[numpy.get_include()]) \ No newline at end of file diff --git a/syntax_model_files/gensim/models/word2vec_inner_synt.c b/syntax_model_files/gensim/models/word2vec_inner_synt.c new file mode 100644 index 0000000000..657445efcb --- /dev/null +++ b/syntax_model_files/gensim/models/word2vec_inner_synt.c @@ -0,0 +1,13117 @@ +/* Generated by Cython 0.23.4 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/run/media/robert/1TB-1/linuxfolder/anaconda3/lib/python3.5/site-packages/gensim/models/voidptr.h" + ] + } +} +END: Cython Metadata */ + +#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_23_4" +#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 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_CPYTHON 0 +#else +#define CYTHON_COMPILING_IN_PYPY 0 +#define CYTHON_COMPILING_IN_CPYTHON 1 +#endif +#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000 +#define CYTHON_USE_PYLONG_INTERNALS 1 +#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 +#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_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) +#else + #define CYTHON_PEP393_ENABLED 0 + #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_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])) +#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 +#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 + #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) +#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 PY_VERSION_HEX >= 0x030500B1 +#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods +#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) +#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 +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)) +#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 +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) + +#ifndef CYTHON_INLINE + #if 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 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__word2vec_inner_synt2 +#define __PYX_HAVE_API__gensim__models__word2vec_inner_synt2 +#include "voidptr.h" +#include "string.h" +#include "stdio.h" +#include "stdlib.h" +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include "math.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#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_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +typedef struct {PyObject **p; 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_Int(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_COMPILING_IN_CPYTHON +#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 && __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 int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +#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/word2vec_inner_synt2.pyx", + "Cython/Includes/numpy/__init__.pxd", + "Cython/Includes/cpython/type.pxd", +}; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_REAL_t; +#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 + +#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 + + +/*--- Type declarations ---*/ + +/* "../../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; + +/* "../../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; + +/* "../../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; + +/* "../../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_synt2.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_20word2vec_inner_synt2_scopy_ptr)(int const *, float const *, int const *, float *, int const *); + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_saxpy_ptr)(int const *, float const *, float const *, int const *, float *, int const *); + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_sdot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_dsdot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_snrm2_ptr)(int const *, float const *, int const *); + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_sscal_ptr)(int const *, float const *, float const *, int const *); + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_REAL_t (*__pyx_t_6gensim_6models_20word2vec_inner_synt2_our_dot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_our_saxpy_ptr)(int const *, float const *, float const *, int const *, float *, int const *); + +/* --- Runtime support code (head) --- */ +#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) + +#if CYTHON_COMPILING_IN_CPYTHON +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 + +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +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); + +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +#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 + +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)); +} + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +#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 + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb); +static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb); + +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +#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 + +typedef struct { + int code_line; + PyCodeObject* code_object; +} __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); + +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_As_PY_LONG_LONG(PyObject *); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); + +static CYTHON_INLINE npy_uint32 __Pyx_PyInt_As_npy_uint32(PyObject *); + +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +static CYTHON_INLINE long __Pyx_pow_long(long, long); + +#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(_WIN32) || defined(__clang__)) && defined(__cplusplus) && CYTHON_CCOMPLEX + #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 + +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eqf(a, b) ((a)==(b)) + #define __Pyx_c_sumf(a, b) ((a)+(b)) + #define __Pyx_c_difff(a, b) ((a)-(b)) + #define __Pyx_c_prodf(a, b) ((a)*(b)) + #define __Pyx_c_quotf(a, b) ((a)/(b)) + #define __Pyx_c_negf(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zerof(z) ((z)==(float)0) + #define __Pyx_c_conjf(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_absf(z) (::std::abs(z)) + #define __Pyx_c_powf(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zerof(z) ((z)==0) + #define __Pyx_c_conjf(z) (conjf(z)) + #if 1 + #define __Pyx_c_absf(z) (cabsf(z)) + #define __Pyx_c_powf(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq(a, b) ((a)==(b)) + #define __Pyx_c_sum(a, b) ((a)+(b)) + #define __Pyx_c_diff(a, b) ((a)-(b)) + #define __Pyx_c_prod(a, b) ((a)*(b)) + #define __Pyx_c_quot(a, b) ((a)/(b)) + #define __Pyx_c_neg(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero(z) ((z)==(double)0) + #define __Pyx_c_conj(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs(z) (::std::abs(z)) + #define __Pyx_c_pow(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero(z) ((z)==0) + #define __Pyx_c_conj(z) (conj(z)) + #if 1 + #define __Pyx_c_abs(z) (cabs(z)) + #define __Pyx_c_pow(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +static int __Pyx_check_binary_version(void); + +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL) +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_setattro)) + return tp->tp_setattro(obj, attr_name, value); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_setattr)) + return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value); +#endif + return PyObject_SetAttr(obj, attr_name, value); +} +#else +#define __Pyx_PyObject_DelAttrStr(o,n) PyObject_DelAttr(o,n) +#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v) +#endif + +static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig); + +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); + +#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 + +static PyObject *__Pyx_ImportModule(const char *name); + +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* 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 'cython' */ + +/* Module declarations from 'libc.math' */ + +/* Module declarations from 'gensim.models.word2vec_inner_synt2' */ +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_scopy_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_scopy; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_saxpy_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_saxpy; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_sdot_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_sdot; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_dsdot_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_dsdot; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_snrm2_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_snrm2; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_sscal_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_sscal; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_6gensim_6models_20word2vec_inner_synt2_EXP_TABLE[0x3E8]; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_our_dot_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_our_saxpy_ptr __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_6gensim_6models_20word2vec_inner_synt2_LOG_TABLE[0x3E8]; +static int __pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF; +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_double(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_float(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_noblas(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_saxpy_noblas(int const *, float const *, float const *, int const *, float *, int const *); /*proto*/ +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_bisect_left(__pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG); /*proto*/ +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_random_int32(unsigned PY_LONG_LONG *); /*proto*/ +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_fast_sentence_sg_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int const , __pyx_t_5numpy_uint32_t const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *); /*proto*/ +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_fast_sentence_sg_neg(int const , __pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int const , __pyx_t_5numpy_uint32_t const , __pyx_t_5numpy_uint32_t const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, unsigned PY_LONG_LONG, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *); /*proto*/ +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_fast_sentence_cbow_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int, int, int, int, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *); /*proto*/ +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_fast_sentence_cbow_neg(int const , __pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, int *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int, int, int, int, unsigned PY_LONG_LONG, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *); /*proto*/ +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_score_pair_sg_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int const , __pyx_t_5numpy_uint32_t const , __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *); /*proto*/ +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_score_pair_cbow_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *, int, int, int, int); /*proto*/ +#define __Pyx_MODULE_NAME "gensim.models.word2vec_inner_synt2" +int __pyx_module_is_main_gensim__models__word2vec_inner_synt2 = 0; + +/* Implementation of 'gensim.models.word2vec_inner_synt2' */ +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 char __pyx_k_B[] = "B"; +static char __pyx_k_H[] = "H"; +static char __pyx_k_I[] = "I"; +static char __pyx_k_L[] = "L"; +static char __pyx_k_O[] = "O"; +static char __pyx_k_Q[] = "Q"; +static char __pyx_k_b[] = "b"; +static char __pyx_k_d[] = "d"; +static char __pyx_k_f[] = "f"; +static char __pyx_k_g[] = "g"; +static char __pyx_k_h[] = "h"; +static char __pyx_k_i[] = "i"; +static char __pyx_k_j[] = "j"; +static char __pyx_k_k[] = "k"; +static char __pyx_k_l[] = "l"; +static char __pyx_k_q[] = "q"; +static char __pyx_k_x[] = "x"; +static char __pyx_k_y[] = "y"; +static char __pyx_k_Zd[] = "Zd"; +static char __pyx_k_Zf[] = "Zf"; +static char __pyx_k_Zg[] = "Zg"; +static char __pyx_k_hs[] = "hs"; +static char __pyx_k_np[] = "np"; +static char __pyx_k__11[] = "*"; +static char __pyx_k_REAL[] = "REAL"; +static char __pyx_k_code[] = "code"; +static char __pyx_k_init[] = "init"; +static char __pyx_k_item[] = "item"; +static char __pyx_k_main[] = "__main__"; +static char __pyx_k_neu1[] = "_neu1"; +static char __pyx_k_sdot[] = "sdot"; +static char __pyx_k_sent[] = "sent"; +static char __pyx_k_size[] = "size"; +static char __pyx_k_syn0[] = "syn0"; +static char __pyx_k_syn1[] = "syn1"; +static char __pyx_k_test[] = "__test__"; +static char __pyx_k_word[] = "word"; +static char __pyx_k_work[] = "_work"; +static char __pyx_k_alpha[] = "alpha"; +static char __pyx_k_codes[] = "codes"; +static char __pyx_k_d_res[] = "d_res"; +static char __pyx_k_dsdot[] = "dsdot"; +static char __pyx_k_fblas[] = "fblas"; +static char __pyx_k_index[] = "index"; +static char __pyx_k_model[] = "model"; +static char __pyx_k_numpy[] = "numpy"; +static char __pyx_k_p_res[] = "p_res"; +static char __pyx_k_point[] = "point"; +static char __pyx_k_range[] = "range"; +static char __pyx_k_saxpy[] = "saxpy"; +static char __pyx_k_scopy[] = "scopy"; +static char __pyx_k_snrm2[] = "snrm2"; +static char __pyx_k_sscal[] = "sscal"; +static char __pyx_k_token[] = "token"; +static char __pyx_k_vocab[] = "vocab"; +static char __pyx_k_import[] = "__import__"; +static char __pyx_k_neu1_2[] = "neu1"; +static char __pyx_k_points[] = "points"; +static char __pyx_k_random[] = "random"; +static char __pyx_k_result[] = "result"; +static char __pyx_k_sample[] = "sample"; +static char __pyx_k_window[] = "window"; +static char __pyx_k_work_2[] = "work"; +static char __pyx_k_alpha_2[] = "_alpha"; +static char __pyx_k_float32[] = "float32"; +static char __pyx_k_idx_end[] = "idx_end"; +static char __pyx_k_indexes[] = "indexes"; +static char __pyx_k_our_dot[] = "our_dot"; +static char __pyx_k_randint[] = "randint"; +static char __pyx_k_syn1neg[] = "syn1neg"; +static char __pyx_k_vlookup[] = "vlookup"; +static char __pyx_k_codelens[] = "codelens"; +static char __pyx_k_cpointer[] = "_cpointer"; +static char __pyx_k_expected[] = "expected"; +static char __pyx_k_negative[] = "negative"; +static char __pyx_k_pyx_capi[] = "__pyx_capi__"; +static char __pyx_k_sent_idx[] = "sent_idx"; +static char __pyx_k_sentence[] = "sentence"; +static char __pyx_k_EXP_TABLE[] = "EXP_TABLE"; +static char __pyx_k_cbow_mean[] = "cbow_mean"; +static char __pyx_k_cum_table[] = "cum_table"; +static char __pyx_k_enumerate[] = "enumerate"; +static char __pyx_k_idx_start[] = "idx_start"; +static char __pyx_k_our_saxpy[] = "our_saxpy"; +static char __pyx_k_sentences[] = "sentences"; +static char __pyx_k_ValueError[] = "ValueError"; +static char __pyx_k_sample_int[] = "sample_int"; +static char __pyx_k_syn0_lockf[] = "syn0_lockf"; +static char __pyx_k_word_locks[] = "word_locks"; +static char __pyx_k_ImportError[] = "ImportError"; +static char __pyx_k_layer1_size[] = "layer1_size"; +static char __pyx_k_next_random[] = "next_random"; +static char __pyx_k_FAST_VERSION[] = "FAST_VERSION"; +static char __pyx_k_RuntimeError[] = "RuntimeError"; +static char __pyx_k_sentence_idx[] = "sentence_idx"; +static char __pyx_k_sentence_len[] = "sentence_len"; +static char __pyx_k_cum_table_len[] = "cum_table_len"; +static char __pyx_k_train_batch_sg[] = "train_batch_sg"; +static char __pyx_k_effective_words[] = "effective_words"; +static char __pyx_k_reduced_windows[] = "reduced_windows"; +static char __pyx_k_train_batch_cbow[] = "train_batch_cbow"; +static char __pyx_k_scipy_linalg_blas[] = "scipy.linalg.blas"; +static char __pyx_k_score_sentence_sg[] = "score_sentence_sg"; +static char __pyx_k_MAX_WORDS_IN_BATCH[] = "MAX_WORDS_IN_BATCH"; +static char __pyx_k_effective_sentences[] = "effective_sentences"; +static char __pyx_k_score_sentence_cbow[] = "score_sentence_cbow"; +static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static char __pyx_k_run_media_robert_1TB_1_linuxfol[] = "/run/media/robert/1TB-1/linuxfolder/anaconda3/lib/python3.5/site-packages/gensim/models/word2vec_inner_synt2.pyx"; +static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static char __pyx_k_gensim_models_word2vec_inner_syn[] = "gensim.models.word2vec_inner_synt2"; +static char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_EXP_TABLE; +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__11; +static PyObject *__pyx_n_s_alpha; +static PyObject *__pyx_n_s_alpha_2; +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_cpointer; +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_dsdot; +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_word2vec_inner_syn; +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_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_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_np; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_n_s_our_dot; +static PyObject *__pyx_n_s_our_saxpy; +static PyObject *__pyx_n_s_p_res; +static PyObject *__pyx_n_s_point; +static PyObject *__pyx_n_s_points; +static PyObject *__pyx_n_s_pyx_capi; +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_result; +static PyObject *__pyx_kp_s_run_media_robert_1TB_1_linuxfol; +static PyObject *__pyx_n_s_sample; +static PyObject *__pyx_n_s_sample_int; +static PyObject *__pyx_n_s_saxpy; +static PyObject *__pyx_n_s_scipy_linalg_blas; +static PyObject *__pyx_n_s_scopy; +static PyObject *__pyx_n_s_score_sentence_cbow; +static PyObject *__pyx_n_s_score_sentence_sg; +static PyObject *__pyx_n_s_sdot; +static PyObject *__pyx_n_s_sent; +static PyObject *__pyx_n_s_sent_idx; +static PyObject *__pyx_n_s_sentence; +static PyObject *__pyx_n_s_sentence_idx; +static PyObject *__pyx_n_s_sentence_len; +static PyObject *__pyx_n_s_sentences; +static PyObject *__pyx_n_s_size; +static PyObject *__pyx_n_s_snrm2; +static PyObject *__pyx_n_s_sscal; +static PyObject *__pyx_n_s_syn0; +static PyObject *__pyx_n_s_syn0_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_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; +static PyObject *__pyx_n_s_work; +static PyObject *__pyx_n_s_work_2; +static PyObject *__pyx_n_s_x; +static PyObject *__pyx_n_s_y; +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_train_batch_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work); /* proto */ +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_4score_sentence_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work); /* proto */ +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_6score_sentence_cbow(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work, PyObject *__pyx_v__neu1); /* proto */ +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_8init(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__12; +static PyObject *__pyx_tuple__14; +static PyObject *__pyx_tuple__16; +static PyObject *__pyx_tuple__18; +static PyObject *__pyx_tuple__20; +static PyObject *__pyx_codeobj__13; +static PyObject *__pyx_codeobj__15; +static PyObject *__pyx_codeobj__17; +static PyObject *__pyx_codeobj__19; +static PyObject *__pyx_codeobj__21; + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_REAL_t __pyx_f_6gensim_6models_20word2vec_inner_synt2_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) { + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_r; + + /* "gensim/models/word2vec_inner_synt2.pyx":47 + * # 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_20word2vec_inner_synt2_REAL_t)__pyx_v_6gensim_6models_20word2vec_inner_synt2_dsdot(__pyx_v_N, __pyx_v_X, __pyx_v_incX, __pyx_v_Y, __pyx_v_incY)); + goto __pyx_L0; + + /* "gensim/models/word2vec_inner_synt2.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 */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.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_20word2vec_inner_synt2_REAL_t __pyx_f_6gensim_6models_20word2vec_inner_synt2_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) { + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_r; + + /* "gensim/models/word2vec_inner_synt2.pyx":51 + * # 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_20word2vec_inner_synt2_REAL_t)__pyx_v_6gensim_6models_20word2vec_inner_synt2_sdot(__pyx_v_N, __pyx_v_X, __pyx_v_incX, __pyx_v_Y, __pyx_v_incY)); + goto __pyx_L0; + + /* "gensim/models/word2vec_inner_synt2.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 */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.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 + * cdef int i + */ + +static __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_noblas(int const *__pyx_v_N, float const *__pyx_v_X, CYTHON_UNUSED int const *__pyx_v_incX, float const *__pyx_v_Y, CYTHON_UNUSED int const *__pyx_v_incY) { + int __pyx_v_i; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_a; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_r; + int __pyx_t_1; + + /* "gensim/models/word2vec_inner_synt2.pyx":58 + * cdef int i + * cdef REAL_t a + * a = 0.0 # <<<<<<<<<<<<<< + * for i from 0 <= i < N[0] by 1: + * a += X[i] * Y[i] + */ + __pyx_v_a = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)0.0); + + /* "gensim/models/word2vec_inner_synt2.pyx":59 + * cdef REAL_t a + * a = 0.0 + * for i from 0 <= i < N[0] by 1: # <<<<<<<<<<<<<< + * a += X[i] * Y[i] + * return a + */ + __pyx_t_1 = (__pyx_v_N[0]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i+=1) { + + /* "gensim/models/word2vec_inner_synt2.pyx":60 + * a = 0.0 + * 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]))); + } + + /* "gensim/models/word2vec_inner_synt2.pyx":61 + * 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_synt2.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 + * cdef int i + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.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 + * for i from 0 <= i < N[0] by 1: + */ + +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_saxpy_noblas(int const *__pyx_v_N, float const *__pyx_v_alpha, float const *__pyx_v_X, int const *__pyx_v_incX, float *__pyx_v_Y, int const *__pyx_v_incY) { + int __pyx_v_i; + int __pyx_t_1; + + /* "gensim/models/word2vec_inner_synt2.pyx":66 + * 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 + * 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) { + + /* "gensim/models/word2vec_inner_synt2.pyx":67 + * 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_synt2.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 + * for i from 0 <= i < N[0] by 1: + */ + + /* function exit code */ +} + +/* "gensim/models/word2vec_inner_synt2.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, + */ + +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const __pyx_v_word2_index, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_g; + int __pyx_t_1; + PY_LONG_LONG __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "gensim/models/word2vec_inner_synt2.pyx":76 + * + * cdef long long a, b + * cdef long long row1 = word2_index * size, row2 # <<<<<<<<<<<<<< + * cdef REAL_t f, g + * + */ + __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":79 + * cdef REAL_t f, g + * + * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * for b in range(codelen): + * row2 = word_point[b] * size + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)))); + + /* "gensim/models/word2vec_inner_synt2.pyx":80 + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelen): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + */ + __pyx_t_1 = __pyx_v_codelen; + for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_b = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":81 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelen): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":82 + * for b in range(codelen): + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot((&__pyx_v_size), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":83 + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L6_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":84 + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":83 + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":85 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_f = (__pyx_v_6gensim_6models_20word2vec_inner_synt2_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "gensim/models/word2vec_inner_synt2.pyx":86 + * continue + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1[row2], &ONE) + */ + __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/word2vec_inner_synt2.pyx":87 + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1[row2], &ONE) + * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":88 + * g = (1 - word_code[b] - f) * alpha + * 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_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + __pyx_L3_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":89 + * 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_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.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, + */ + + /* function exit code */ +} + +/* "gensim/models/word2vec_inner_synt2.pyx":93 + * + * # 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 + * while hi > lo: + */ + +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_bisect_left(__pyx_t_5numpy_uint32_t *__pyx_v_a, unsigned PY_LONG_LONG __pyx_v_x, unsigned PY_LONG_LONG __pyx_v_lo, unsigned PY_LONG_LONG __pyx_v_hi) { + unsigned PY_LONG_LONG __pyx_v_mid; + unsigned PY_LONG_LONG __pyx_r; + int __pyx_t_1; + + /* "gensim/models/word2vec_inner_synt2.pyx":95 + * 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 + * while hi > lo: # <<<<<<<<<<<<<< + * mid = (lo + hi) >> 1 + * if a[mid] >= x: + */ + while (1) { + __pyx_t_1 = ((__pyx_v_hi > __pyx_v_lo) != 0); + if (!__pyx_t_1) break; + + /* "gensim/models/word2vec_inner_synt2.pyx":96 + * cdef unsigned long long mid + * while hi > lo: + * mid = (lo + hi) >> 1 # <<<<<<<<<<<<<< + * if a[mid] >= x: + * hi = mid + */ + __pyx_v_mid = ((__pyx_v_lo + __pyx_v_hi) >> 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":97 + * while hi > lo: + * mid = (lo + hi) >> 1 + * if a[mid] >= x: # <<<<<<<<<<<<<< + * hi = mid + * else: + */ + __pyx_t_1 = (((__pyx_v_a[__pyx_v_mid]) >= __pyx_v_x) != 0); + if (__pyx_t_1) { + + /* "gensim/models/word2vec_inner_synt2.pyx":98 + * mid = (lo + hi) >> 1 + * if a[mid] >= x: + * hi = mid # <<<<<<<<<<<<<< + * else: + * lo = mid + 1 + */ + __pyx_v_hi = __pyx_v_mid; + + /* "gensim/models/word2vec_inner_synt2.pyx":97 + * while hi > lo: + * mid = (lo + hi) >> 1 + * if a[mid] >= x: # <<<<<<<<<<<<<< + * hi = mid + * else: + */ + goto __pyx_L5; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":100 + * hi = mid + * else: + * lo = mid + 1 # <<<<<<<<<<<<<< + * return lo + * + */ + /*else*/ { + __pyx_v_lo = (__pyx_v_mid + 1); + } + __pyx_L5:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":101 + * 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_synt2.pyx":93 + * + * # 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 + * while hi > lo: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":105 + * # this quick & dirty RNG apparently matches Java's (non-Secure)Random + * # note this function side-effects next_random to set up the next number + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: # <<<<<<<<<<<<<< + * cdef unsigned long long this_random = next_random[0] >> 16 + * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL + */ + +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_random_int32(unsigned PY_LONG_LONG *__pyx_v_next_random) { + unsigned PY_LONG_LONG __pyx_v_this_random; + unsigned PY_LONG_LONG __pyx_r; + + /* "gensim/models/word2vec_inner_synt2.pyx":106 + * # note this function side-effects next_random to set up the next number + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: + * cdef unsigned long long this_random = next_random[0] >> 16 # <<<<<<<<<<<<<< + * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL + * return this_random + */ + __pyx_v_this_random = ((__pyx_v_next_random[0]) >> 16); + + /* "gensim/models/word2vec_inner_synt2.pyx":107 + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: + * 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); + + /* "gensim/models/word2vec_inner_synt2.pyx":108 + * 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; + goto __pyx_L0; + + /* "gensim/models/word2vec_inner_synt2.pyx":105 + * # this quick & dirty RNG apparently matches Java's (non-Secure)Random + * # note this function side-effects next_random to set up the next number + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: # <<<<<<<<<<<<<< + * cdef unsigned long long this_random = next_random[0] >> 16 + * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":110 + * 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, + */ + +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0, __pyx_t_6gensim_6models_20word2vec_inner_synt2_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_word2_index, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work, unsigned PY_LONG_LONG __pyx_v_next_random, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + unsigned PY_LONG_LONG __pyx_v_modulo; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_g; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_label; + __pyx_t_5numpy_uint32_t __pyx_v_target_index; + int __pyx_v_d; + unsigned PY_LONG_LONG __pyx_r; + long __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "gensim/models/word2vec_inner_synt2.pyx":117 + * + * cdef long long a + * cdef long long row1 = word2_index * size, row2 # <<<<<<<<<<<<<< + * cdef unsigned long long modulo = 281474976710655ULL + * cdef REAL_t f, g, label + */ + __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":118 + * cdef long long a + * cdef long long row1 = word2_index * size, row2 + * cdef unsigned long long modulo = 281474976710655ULL # <<<<<<<<<<<<<< + * cdef REAL_t f, g, label + * cdef np.uint32_t target_index + */ + __pyx_v_modulo = 281474976710655ULL; + + /* "gensim/models/word2vec_inner_synt2.pyx":123 + * 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_20word2vec_inner_synt2_REAL_t)))); + + /* "gensim/models/word2vec_inner_synt2.pyx":125 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * + * for d in range(negative+1): # <<<<<<<<<<<<<< + * if d == 0: + * target_index = word_index + */ + __pyx_t_1 = (__pyx_v_negative + 1); + for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_d = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":126 + * + * 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/word2vec_inner_synt2.pyx":127 + * 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/word2vec_inner_synt2.pyx":128 + * 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_20word2vec_inner_synt2_ONEF; + + /* "gensim/models/word2vec_inner_synt2.pyx":126 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + goto __pyx_L5; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":130 + * 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_20word2vec_inner_synt2_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/word2vec_inner_synt2.pyx":131 + * 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/word2vec_inner_synt2.pyx":132 + * 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/word2vec_inner_synt2.pyx":133 + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + * continue # <<<<<<<<<<<<<< + * label = 0.0 + * + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":132 + * 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/word2vec_inner_synt2.pyx":134 + * if target_index == word_index: + * continue + * label = 0.0 # <<<<<<<<<<<<<< + * + * row2 = target_index * size + */ + __pyx_v_label = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)0.0); + } + __pyx_L5:; + + /* "gensim/models/word2vec_inner_synt2.pyx":136 + * label = 0.0 + * + * row2 = target_index * size # <<<<<<<<<<<<<< + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":137 + * + * row2 = target_index * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot((&__pyx_v_size), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":138 + * row2 = target_index * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L8_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":139 + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":138 + * row2 = target_index * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":140 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_20word2vec_inner_synt2_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "gensim/models/word2vec_inner_synt2.pyx":141 + * continue + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + */ + __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/word2vec_inner_synt2.pyx":142 + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":143 + * g = (label - f) * alpha + * 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_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + __pyx_L3_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":145 + * 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_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":147 + * 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_synt2.pyx":110 + * 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, + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":150 + * + * + * 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, + */ + +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_REAL_t *__pyx_v_neu1, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_g; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_count; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_inv_count; + int __pyx_v_m; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PY_LONG_LONG __pyx_t_4; + int __pyx_t_5; + + /* "gensim/models/word2vec_inner_synt2.pyx":158 + * cdef long long a, b + * cdef long long row2 + * cdef REAL_t f, g, count, inv_count = 1.0 # <<<<<<<<<<<<<< + * cdef int m + * + */ + __pyx_v_inv_count = 1.0; + + /* "gensim/models/word2vec_inner_synt2.pyx":161 + * 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_20word2vec_inner_synt2_REAL_t)))); + + /* "gensim/models/word2vec_inner_synt2.pyx":162 + * + * 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_20word2vec_inner_synt2_REAL_t)0.0); + + /* "gensim/models/word2vec_inner_synt2.pyx":163 + * 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/word2vec_inner_synt2.pyx":164 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":165 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * count += ONEF + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":164 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":167 + * continue + * else: + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + */ + /*else*/ { + __pyx_v_count = (__pyx_v_count + __pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF); + + /* "gensim/models/word2vec_inner_synt2.pyx":168 + * else: + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * if count > (0.5): + * inv_count = ONEF/count + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + } + __pyx_L3_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":169 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * 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_20word2vec_inner_synt2_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":170 + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + * inv_count = ONEF/count # <<<<<<<<<<<<<< + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + */ + __pyx_v_inv_count = (__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF / __pyx_v_count); + + /* "gensim/models/word2vec_inner_synt2.pyx":169 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":171 + * if count > (0.5): + * 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) { + + /* "gensim/models/word2vec_inner_synt2.pyx":172 + * 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_20word2vec_inner_synt2_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":171 + * if count > (0.5): + * inv_count = ONEF/count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + * + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":174 + * 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 + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)))); + + /* "gensim/models/word2vec_inner_synt2.pyx":175 + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelens[i]): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + */ + __pyx_t_1 = (__pyx_v_codelens[__pyx_v_i]); + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) { + __pyx_v_b = __pyx_t_4; + + /* "gensim/models/word2vec_inner_synt2.pyx":176 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelens[i]): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":177 + * for b in range(codelens[i]): + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":178 + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_5 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_5 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_5; + __pyx_L11_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":179 + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha + */ + goto __pyx_L8_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":178 + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":180 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_f = (__pyx_v_6gensim_6models_20word2vec_inner_synt2_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "gensim/models/word2vec_inner_synt2.pyx":181 + * continue + * f = EXP_TABLE[((f + 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) + */ + __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/word2vec_inner_synt2.pyx":182 + * f = EXP_TABLE[((f + 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) + * + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":183 + * 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 + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + __pyx_L8_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":185 + * 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_synt2.pyx":186 + * + * 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_20word2vec_inner_synt2_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":185 + * 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_synt2.pyx":188 + * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) + * + * 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/word2vec_inner_synt2.pyx":189 + * + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":190 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m] * size], &ONE) + */ + goto __pyx_L14_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":189 + * + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":192 + * continue + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m] * size], &ONE) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + } + __pyx_L14_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":150 + * + * + * 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, + */ + + /* function exit code */ +} + +/* "gensim/models/word2vec_inner_synt2.pyx":195 + * + * + * 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, + */ + +static unsigned PY_LONG_LONG __pyx_f_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_REAL_t *__pyx_v_neu1, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn1neg, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t const __pyx_v_alpha, __pyx_t_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_row2; + unsigned PY_LONG_LONG __pyx_v_modulo; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_g; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_count; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_inv_count; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_label; + __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; + long __pyx_t_4; + int __pyx_t_5; + + /* "gensim/models/word2vec_inner_synt2.pyx":203 + * 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 + * cdef np.uint32_t target_index, word_index + */ + __pyx_v_modulo = 281474976710655ULL; + + /* "gensim/models/word2vec_inner_synt2.pyx":204 + * cdef long long row2 + * cdef unsigned long long modulo = 281474976710655ULL + * cdef REAL_t f, g, count, inv_count = 1.0, label # <<<<<<<<<<<<<< + * cdef np.uint32_t target_index, word_index + * cdef int d, m + */ + __pyx_v_inv_count = 1.0; + + /* "gensim/models/word2vec_inner_synt2.pyx":208 + * 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_synt2.pyx":210 + * 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_20word2vec_inner_synt2_REAL_t)))); + + /* "gensim/models/word2vec_inner_synt2.pyx":211 + * + * 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_20word2vec_inner_synt2_REAL_t)0.0); + + /* "gensim/models/word2vec_inner_synt2.pyx":212 + * 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/word2vec_inner_synt2.pyx":213 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":214 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * count += ONEF + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":213 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":216 + * continue + * else: + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + */ + /*else*/ { + __pyx_v_count = (__pyx_v_count + __pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF); + + /* "gensim/models/word2vec_inner_synt2.pyx":217 + * else: + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * if count > (0.5): + * inv_count = ONEF/count + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + } + __pyx_L3_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":218 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * 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_20word2vec_inner_synt2_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":219 + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + * inv_count = ONEF/count # <<<<<<<<<<<<<< + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + */ + __pyx_v_inv_count = (__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF / __pyx_v_count); + + /* "gensim/models/word2vec_inner_synt2.pyx":218 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":220 + * if count > (0.5): + * 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) { + + /* "gensim/models/word2vec_inner_synt2.pyx":221 + * 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_20word2vec_inner_synt2_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":220 + * if count > (0.5): + * inv_count = ONEF/count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + * + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":223 + * 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_20word2vec_inner_synt2_REAL_t)))); + + /* "gensim/models/word2vec_inner_synt2.pyx":225 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * + * for d in range(negative+1): # <<<<<<<<<<<<<< + * if d == 0: + * target_index = word_index + */ + __pyx_t_4 = (__pyx_v_negative + 1); + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_d = __pyx_t_1; + + /* "gensim/models/word2vec_inner_synt2.pyx":226 + * + * 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/word2vec_inner_synt2.pyx":227 + * 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/word2vec_inner_synt2.pyx":228 + * 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_20word2vec_inner_synt2_ONEF; + + /* "gensim/models/word2vec_inner_synt2.pyx":226 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + goto __pyx_L10; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":230 + * 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_20word2vec_inner_synt2_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/word2vec_inner_synt2.pyx":231 + * 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/word2vec_inner_synt2.pyx":232 + * 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/word2vec_inner_synt2.pyx":233 + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + * continue # <<<<<<<<<<<<<< + * label = 0.0 + * + */ + goto __pyx_L8_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":232 + * 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/word2vec_inner_synt2.pyx":234 + * if target_index == word_index: + * continue + * label = 0.0 # <<<<<<<<<<<<<< + * + * row2 = target_index * size + */ + __pyx_v_label = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)0.0); + } + __pyx_L10:; + + /* "gensim/models/word2vec_inner_synt2.pyx":236 + * label = 0.0 + * + * row2 = target_index * size # <<<<<<<<<<<<<< + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":237 + * + * row2 = target_index * size + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":238 + * row2 = target_index * size + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_5 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_5 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_5; + __pyx_L13_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":239 + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha + */ + goto __pyx_L8_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":238 + * row2 = target_index * size + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":240 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_20word2vec_inner_synt2_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "gensim/models/word2vec_inner_synt2.pyx":241 + * continue + * f = EXP_TABLE[((f + 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) + */ + __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); + + /* "gensim/models/word2vec_inner_synt2.pyx":242 + * f = EXP_TABLE[((f + 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) + * + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":243 + * 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 + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + __pyx_L8_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":245 + * 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_synt2.pyx":246 + * + * 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_20word2vec_inner_synt2_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":245 + * 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_synt2.pyx":248 + * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) + * + * 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/word2vec_inner_synt2.pyx":249 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":250 + * for m in range(j,k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) + */ + goto __pyx_L16_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":249 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":252 + * continue + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) # <<<<<<<<<<<<<< + * + * return next_random + */ + /*else*/ { + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v_work, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + } + __pyx_L16_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":254 + * 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_synt2.pyx":195 + * + * + * 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, + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_1train_batch_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6gensim_6models_20word2vec_inner_synt2_1train_batch_sg = {"train_batch_sg", (PyCFunction)__pyx_pw_6gensim_6models_20word2vec_inner_synt2_1train_batch_sg, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 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,0}; + PyObject* values[4] = {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 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, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __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, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __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, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentences = values[1]; + __pyx_v_alpha = values[2]; + __pyx_v__work = values[3]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("train_batch_sg", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.train_batch_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6gensim_6models_20word2vec_inner_synt2_train_batch_sg(__pyx_self, __pyx_v_model, __pyx_v_sentences, __pyx_v_alpha, __pyx_v__work); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_train_batch_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work) { + int __pyx_v_hs; + int __pyx_v_negative; + int __pyx_v_sample; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_word_locks; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_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_20word2vec_inner_synt2_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; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_sent = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + CYTHON_UNUSED PyObject *__pyx_v_item = 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_20word2vec_inner_synt2_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; + Py_ssize_t __pyx_t_16; + PyObject *__pyx_t_17 = NULL; + int __pyx_t_18; + int __pyx_t_19; + int __pyx_t_20; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("train_batch_sg", 0); + + /* "gensim/models/word2vec_inner_synt2.pyx":258 + * + * def train_batch_sg(model, sentences, alpha, _work): + * 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_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_hs = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":259 + * def train_batch_sg(model, sentences, alpha, _work): + * 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_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_negative = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":260 + * cdef int hs = model.hs + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_sample); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sample = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":262 + * cdef int sample = (model.sample != 0) + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * cdef REAL_t *work + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":263 + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef REAL_t _alpha = alpha + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_lockf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_word_locks = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":265 + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * 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_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v__alpha = __pyx_t_4; + + /* "gensim/models/word2vec_inner_synt2.pyx":266 + * 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_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_size = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":272 + * 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_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_window = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":275 + * + * 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_synt2.pyx":290 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":291 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":290 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":293 + * 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/word2vec_inner_synt2.pyx":294 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1neg = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":295 + * 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_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __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/word2vec_inner_synt2.pyx":296 + * 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_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cum_table_len = __pyx_t_6; + + /* "gensim/models/word2vec_inner_synt2.pyx":293 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":297 + * 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/word2vec_inner_synt2.pyx":298 + * 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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_next_random = __pyx_t_9; + + /* "gensim/models/word2vec_inner_synt2.pyx":297 + * 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/word2vec_inner_synt2.pyx":301 + * + * # 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_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "gensim/models/word2vec_inner_synt2.pyx":304 + * + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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_vocab); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_vlookup = __pyx_t_8; + __pyx_t_8 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":305 + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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/word2vec_inner_synt2.pyx":306 + * vlookup = model.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_8 = __pyx_v_sentences; __Pyx_INCREF(__pyx_t_8); __pyx_t_6 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_sentences); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_8))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_10(__pyx_t_8); + 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_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_sent, __pyx_t_3); + __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":307 + * 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_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = ((!__pyx_t_5) != 0); + if (__pyx_t_7) { + + /* "gensim/models/word2vec_inner_synt2.pyx":308 + * 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/word2vec_inner_synt2.pyx":307 + * 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/word2vec_inner_synt2.pyx":309 + * 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_3 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_3); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + } else { + __pyx_t_11 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_12 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_12)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_12(__pyx_t_3); + 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_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_1); + __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":310 + * 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_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_7 != 0)) { + __pyx_t_13 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_13 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __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/word2vec_inner_synt2.pyx":311 + * 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/word2vec_inner_synt2.pyx":312 + * 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/word2vec_inner_synt2.pyx":311 + * 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/word2vec_inner_synt2.pyx":313 + * 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_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = __Pyx_PyInt_From_unsigned_PY_LONG_LONG(__pyx_f_6gensim_6models_20word2vec_inner_synt2_random_int32((&__pyx_v_next_random))); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __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/word2vec_inner_synt2.pyx":314 + * 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 + * if hs: + */ + goto __pyx_L11_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":313 + * 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/word2vec_inner_synt2.pyx":315 + * if sample and word.sample_int < random_int32(&next_random): + * continue + * indexes[effective_words] = word.index # <<<<<<<<<<<<<< + * if hs: + * codelens[effective_words] = len(word.code) + */ + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_indexes[__pyx_v_effective_words]) = __pyx_t_15; + + /* "gensim/models/word2vec_inner_synt2.pyx":316 + * continue + * indexes[effective_words] = word.index + * 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/word2vec_inner_synt2.pyx":317 + * indexes[effective_words] = word.index + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_16 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_codelens[__pyx_v_effective_words]) = ((int)__pyx_t_16); + + /* "gensim/models/word2vec_inner_synt2.pyx":318 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":319 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":316 + * continue + * indexes[effective_words] = word.index + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":320 + * 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 # TODO: log warning, tally overflow? + */ + __pyx_v_effective_words = (__pyx_v_effective_words + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":321 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + __pyx_t_5 = ((__pyx_v_effective_words == 0x2710) != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":322 + * 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; + + /* "gensim/models/word2vec_inner_synt2.pyx":321 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":309 + * 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_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":327 + * # across sentence boundaries. + * # indices of sentence number X are between tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_14))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_10(__pyx_t_14); + 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_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_i = __pyx_t_2; + __pyx_t_2 = (__pyx_t_2 + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":335 + * # precompute "reduced window" offsets in a single randint() call + * for i, item in enumerate(model.random.randint(0, window, effective_words)): + * reduced_windows[i] = 100 # <<<<<<<<<<<<<< + * + * # release GIL & train on all sentences + */ + (__pyx_v_reduced_windows[__pyx_v_i]) = 0x64; + + /* "gensim/models/word2vec_inner_synt2.pyx":334 + * + * # precompute "reduced window" offsets in a single randint() call + * for i, item in enumerate(model.random.randint(0, window, effective_words)): # <<<<<<<<<<<<<< + * reduced_windows[i] = 100 + * + */ + } + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":338 + * + * # release GIL & train on all sentences + * with nogil: # <<<<<<<<<<<<<< + * # PEREDELAT VSE ZDES. TUT NADO VSE POMENJAT + * for sent_idx in range(effective_sentences): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + #endif + /*try:*/ { + + /* "gensim/models/word2vec_inner_synt2.pyx":340 + * with nogil: + * # PEREDELAT VSE ZDES. TUT NADO VSE POMENJAT + * 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_18 = 0; __pyx_t_18 < __pyx_t_2; __pyx_t_18+=1) { + __pyx_v_sent_idx = __pyx_t_18; + + /* "gensim/models/word2vec_inner_synt2.pyx":341 + * # PEREDELAT VSE ZDES. TUT NADO VSE POMENJAT + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] # <<<<<<<<<<<<<< + * idx_end = sentence_idx[sent_idx + 1] + * i = idx_start + */ + __pyx_v_idx_start = (__pyx_v_sentence_idx[__pyx_v_sent_idx]); + + /* "gensim/models/word2vec_inner_synt2.pyx":342 + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] # <<<<<<<<<<<<<< + * i = idx_start + * j = i - 100 + */ + __pyx_v_idx_end = (__pyx_v_sentence_idx[(__pyx_v_sent_idx + 1)]); + + /* "gensim/models/word2vec_inner_synt2.pyx":343 + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + * i = idx_start # <<<<<<<<<<<<<< + * j = i - 100 + * if j < idx_start: + */ + __pyx_v_i = __pyx_v_idx_start; + + /* "gensim/models/word2vec_inner_synt2.pyx":344 + * idx_end = sentence_idx[sent_idx + 1] + * i = idx_start + * j = i - 100 # <<<<<<<<<<<<<< + * if j < idx_start: + * j = idx_start + */ + __pyx_v_j = (__pyx_v_i - 0x64); + + /* "gensim/models/word2vec_inner_synt2.pyx":345 + * i = idx_start + * j = i - 100 + * if j < idx_start: # <<<<<<<<<<<<<< + * j = idx_start + * k = i + 100 + */ + __pyx_t_5 = ((__pyx_v_j < __pyx_v_idx_start) != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":346 + * j = i - 100 + * if j < idx_start: + * j = idx_start # <<<<<<<<<<<<<< + * k = i + 100 + * if k > idx_end: + */ + __pyx_v_j = __pyx_v_idx_start; + + /* "gensim/models/word2vec_inner_synt2.pyx":345 + * i = idx_start + * j = i - 100 + * if j < idx_start: # <<<<<<<<<<<<<< + * j = idx_start + * k = i + 100 + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":347 + * if j < idx_start: + * j = idx_start + * k = i + 100 # <<<<<<<<<<<<<< + * if k > idx_end: + * k = idx_end + */ + __pyx_v_k = (__pyx_v_i + 0x64); + + /* "gensim/models/word2vec_inner_synt2.pyx":348 + * j = idx_start + * k = i + 100 + * 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/word2vec_inner_synt2.pyx":349 + * k = i + 100 + * 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/word2vec_inner_synt2.pyx":348 + * j = idx_start + * k = i + 100 + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * for j in range(j, k): + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":350 + * if k > idx_end: + * k = idx_end + * for j in range(j, k): # <<<<<<<<<<<<<< + * if j == i: + * continue + */ + __pyx_t_19 = __pyx_v_k; + for (__pyx_t_20 = __pyx_v_j; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) { + __pyx_v_j = __pyx_t_20; + + /* "gensim/models/word2vec_inner_synt2.pyx":351 + * 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/word2vec_inner_synt2.pyx":352 + * for j in range(j, k): + * if j == i: + * continue # <<<<<<<<<<<<<< + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + */ + goto __pyx_L29_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":351 + * k = idx_end + * for j in range(j, k): + * if j == i: # <<<<<<<<<<<<<< + * continue + * if hs: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":353 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":354 + * continue + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) # <<<<<<<<<<<<<< + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + */ + __pyx_f_6gensim_6models_20word2vec_inner_synt2_fast_sentence_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__alpha, __pyx_v_work, __pyx_v_word_locks); + + /* "gensim/models/word2vec_inner_synt2.pyx":353 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":355 + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":356 + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) # <<<<<<<<<<<<<< + * + * return effective_words + */ + __pyx_v_next_random = __pyx_f_6gensim_6models_20word2vec_inner_synt2_fast_sentence_sg_neg(__pyx_v_negative, __pyx_v_cum_table, __pyx_v_cum_table_len, __pyx_v_syn0, __pyx_v_syn1neg, __pyx_v_size, (__pyx_v_indexes[__pyx_v_i]), (__pyx_v_indexes[__pyx_v_j]), __pyx_v__alpha, __pyx_v_work, __pyx_v_next_random, __pyx_v_word_locks); + + /* "gensim/models/word2vec_inner_synt2.pyx":355 + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * + */ + } + __pyx_L29_continue:; + } + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":338 + * + * # release GIL & train on all sentences + * with nogil: # <<<<<<<<<<<<<< + * # PEREDELAT VSE ZDES. TUT NADO VSE POMENJAT + * for sent_idx in range(effective_sentences): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + Py_BLOCK_THREADS + #endif + goto __pyx_L24; + } + __pyx_L24:; + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":358 + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * + * return effective_words # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_r = __pyx_t_14; + __pyx_t_14 = 0; + goto __pyx_L0; + + /* "gensim/models/word2vec_inner_synt2.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * 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_17); + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.train_batch_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_sent); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":361 + * + * + * 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_20word2vec_inner_synt2_3train_batch_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6gensim_6models_20word2vec_inner_synt2_3train_batch_cbow = {"train_batch_cbow", (PyCFunction)__pyx_pw_6gensim_6models_20word2vec_inner_synt2_3train_batch_cbow, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 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_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.train_batch_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_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_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_word_locks; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_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_20word2vec_inner_synt2_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_20word2vec_inner_synt2_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; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_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_item = 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_20word2vec_inner_synt2_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; + Py_ssize_t __pyx_t_16; + PyObject *__pyx_t_17 = NULL; + int __pyx_t_18; + int __pyx_t_19; + int __pyx_t_20; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("train_batch_cbow", 0); + + /* "gensim/models/word2vec_inner_synt2.pyx":362 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_hs = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":363 + * 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_filename = __pyx_f[0]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_negative = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":364 + * 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_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sample = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":365 + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) + * cdef int cbow_mean = model.cbow_mean # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cbow_mean); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cbow_mean = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":367 + * cdef int cbow_mean = model.cbow_mean + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * cdef REAL_t *work + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":368 + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef REAL_t _alpha = alpha + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_lockf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_word_locks = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":370 + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * 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_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v__alpha = __pyx_t_4; + + /* "gensim/models/word2vec_inner_synt2.pyx":371 + * 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_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_size = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":377 + * 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_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_window = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":380 + * + * 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_synt2.pyx":395 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":396 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":395 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":398 + * 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/word2vec_inner_synt2.pyx":399 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1neg = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":400 + * 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_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __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/word2vec_inner_synt2.pyx":401 + * 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_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cum_table_len = __pyx_t_6; + + /* "gensim/models/word2vec_inner_synt2.pyx":398 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":402 + * 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/word2vec_inner_synt2.pyx":403 + * 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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_next_random = __pyx_t_9; + + /* "gensim/models/word2vec_inner_synt2.pyx":402 + * 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/word2vec_inner_synt2.pyx":406 + * + * # 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_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "gensim/models/word2vec_inner_synt2.pyx":407 + * # 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_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_neu1 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__neu1))); + + /* "gensim/models/word2vec_inner_synt2.pyx":410 + * + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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_vocab); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_vlookup = __pyx_t_8; + __pyx_t_8 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":411 + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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/word2vec_inner_synt2.pyx":412 + * vlookup = model.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_8 = __pyx_v_sentences; __Pyx_INCREF(__pyx_t_8); __pyx_t_6 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_sentences); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_8))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_10(__pyx_t_8); + 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_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_sent, __pyx_t_3); + __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":413 + * 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_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = ((!__pyx_t_5) != 0); + if (__pyx_t_7) { + + /* "gensim/models/word2vec_inner_synt2.pyx":414 + * 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/word2vec_inner_synt2.pyx":413 + * 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/word2vec_inner_synt2.pyx":415 + * 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_3 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_3); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + } else { + __pyx_t_11 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_12 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_12)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_12(__pyx_t_3); + 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_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_1); + __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":416 + * 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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_7 != 0)) { + __pyx_t_13 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_13 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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/word2vec_inner_synt2.pyx":417 + * 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/word2vec_inner_synt2.pyx":418 + * 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/word2vec_inner_synt2.pyx":417 + * 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/word2vec_inner_synt2.pyx":419 + * 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_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = __Pyx_PyInt_From_unsigned_PY_LONG_LONG(__pyx_f_6gensim_6models_20word2vec_inner_synt2_random_int32((&__pyx_v_next_random))); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __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/word2vec_inner_synt2.pyx":420 + * 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 + * if hs: + */ + goto __pyx_L11_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":419 + * 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/word2vec_inner_synt2.pyx":421 + * if sample and word.sample_int < random_int32(&next_random): + * continue + * indexes[effective_words] = word.index # <<<<<<<<<<<<<< + * if hs: + * codelens[effective_words] = len(word.code) + */ + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_indexes[__pyx_v_effective_words]) = __pyx_t_15; + + /* "gensim/models/word2vec_inner_synt2.pyx":422 + * continue + * indexes[effective_words] = word.index + * 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/word2vec_inner_synt2.pyx":423 + * indexes[effective_words] = word.index + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_16 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_codelens[__pyx_v_effective_words]) = ((int)__pyx_t_16); + + /* "gensim/models/word2vec_inner_synt2.pyx":424 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":425 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":422 + * continue + * indexes[effective_words] = word.index + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":426 + * 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 # TODO: log warning, tally overflow? + */ + __pyx_v_effective_words = (__pyx_v_effective_words + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":427 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + __pyx_t_5 = ((__pyx_v_effective_words == 0x2710) != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":428 + * 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; + + /* "gensim/models/word2vec_inner_synt2.pyx":427 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":415 + * 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_3); __pyx_t_3 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":433 + * # across sentence boundaries. + * # indices of sentence number X are between tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_14))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_10(__pyx_t_14); + 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_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_i = __pyx_t_2; + __pyx_t_2 = (__pyx_t_2 + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":441 + * # 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_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_reduced_windows[__pyx_v_i]) = __pyx_t_15; + + /* "gensim/models/word2vec_inner_synt2.pyx":440 + * + * # 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_14); __pyx_t_14 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":444 + * + * # 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/word2vec_inner_synt2.pyx":445 + * # 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_18 = 0; __pyx_t_18 < __pyx_t_2; __pyx_t_18+=1) { + __pyx_v_sent_idx = __pyx_t_18; + + /* "gensim/models/word2vec_inner_synt2.pyx":446 + * 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/word2vec_inner_synt2.pyx":447 + * 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/word2vec_inner_synt2.pyx":448 + * 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_19 = __pyx_v_idx_end; + for (__pyx_t_20 = __pyx_v_idx_start; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) { + __pyx_v_i = __pyx_t_20; + + /* "gensim/models/word2vec_inner_synt2.pyx":449 + * 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/word2vec_inner_synt2.pyx":450 + * 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/word2vec_inner_synt2.pyx":451 + * 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/word2vec_inner_synt2.pyx":450 + * 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/word2vec_inner_synt2.pyx":452 + * 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/word2vec_inner_synt2.pyx":453 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * if hs: + */ + __pyx_t_5 = ((__pyx_v_k > __pyx_v_idx_end) != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":454 + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: + * k = idx_end # <<<<<<<<<<<<<< + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + */ + __pyx_v_k = __pyx_v_idx_end; + + /* "gensim/models/word2vec_inner_synt2.pyx":453 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * if hs: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":455 + * if k > idx_end: + * k = idx_end + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":456 + * k = idx_end + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) # <<<<<<<<<<<<<< + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + */ + __pyx_f_6gensim_6models_20word2vec_inner_synt2_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, __pyx_v_syn1, __pyx_v_size, __pyx_v_indexes, __pyx_v__alpha, __pyx_v_work, __pyx_v_i, __pyx_v_j, __pyx_v_k, __pyx_v_cbow_mean, __pyx_v_word_locks); + + /* "gensim/models/word2vec_inner_synt2.pyx":455 + * if k > idx_end: + * k = idx_end + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":457 + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "gensim/models/word2vec_inner_synt2.pyx":458 + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) # <<<<<<<<<<<<<< + * + * return effective_words + */ + __pyx_v_next_random = __pyx_f_6gensim_6models_20word2vec_inner_synt2_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, __pyx_v_syn1neg, __pyx_v_size, __pyx_v_indexes, __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); + + /* "gensim/models/word2vec_inner_synt2.pyx":457 + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * + */ + } + } + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":444 + * + * # 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_L24; + } + __pyx_L24:; + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":460 + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * + * return effective_words # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_r = __pyx_t_14; + __pyx_t_14 = 0; + goto __pyx_L0; + + /* "gensim/models/word2vec_inner_synt2.pyx":361 + * + * + * 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_17); + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.train_batch_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_sent); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":464 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_5score_sentence_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6gensim_6models_20word2vec_inner_synt2_5score_sentence_sg = {"score_sentence_sg", (PyCFunction)__pyx_pw_6gensim_6models_20word2vec_inner_synt2_5score_sentence_sg, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_5score_sentence_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_model = 0; + PyObject *__pyx_v_sentence = 0; + PyObject *__pyx_v__work = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("score_sentence_sg (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_model,&__pyx_n_s_sentence,&__pyx_n_s_work,0}; + PyObject* values[3] = {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 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_sentence)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_sg", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_work)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_sg", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "score_sentence_sg") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentence = values[1]; + __pyx_v__work = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("score_sentence_sg", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.score_sentence_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6gensim_6models_20word2vec_inner_synt2_4score_sentence_sg(__pyx_self, __pyx_v_model, __pyx_v_sentence, __pyx_v__work); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_4score_sentence_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work) { + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work; + int __pyx_v_size; + int __pyx_v_codelens[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_indexes[0x2710]; + int __pyx_v_sentence_len; + int __pyx_v_window; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + long __pyx_v_result; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn1; + __pyx_t_5numpy_uint32_t *__pyx_v_points[0x2710]; + __pyx_t_5numpy_uint8_t *__pyx_v_codes[0x2710]; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + __pyx_t_5numpy_uint32_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("score_sentence_sg", 0); + + /* "gensim/models/word2vec_inner_synt2.pyx":466 + * def score_sentence_sg(model, sentence, _work): + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef int size = model.layer1_size + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":468 + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + * cdef REAL_t *work + * 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_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_size = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":473 + * cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + * cdef int sentence_len + * 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_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_window = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":476 + * + * cdef int i, j, k + * cdef long result = 0 # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn1 + */ + __pyx_v_result = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":482 + * 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_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":485 + * + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< + * + * vlookup = model.vocab + */ + if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "gensim/models/word2vec_inner_synt2.pyx":487 + * work = np.PyArray_DATA(_work) + * + * vlookup = model.vocab # <<<<<<<<<<<<<< + * i = 0 + * for token in sentence: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_vocab); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_vlookup = __pyx_t_1; + __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":488 + * + * vlookup = model.vocab + * i = 0 # <<<<<<<<<<<<<< + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + */ + __pyx_v_i = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":489 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + if (likely(PyList_CheckExact(__pyx_v_sentence)) || PyTuple_CheckExact(__pyx_v_sentence)) { + __pyx_t_1 = __pyx_v_sentence; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_1); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_5); + __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":490 + * i = 0 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None # <<<<<<<<<<<<<< + * if word is None: + * continue # should drop the + */ + __pyx_t_6 = (__Pyx_PySequence_ContainsTF(__pyx_v_token, __pyx_v_vlookup, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_6 != 0)) { + __pyx_t_7 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = __pyx_t_7; + __pyx_t_7 = 0; + } else { + __Pyx_INCREF(Py_None); + __pyx_t_5 = Py_None; + } + __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_5); + __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":491 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # should drop the + * indexes[i] = word.index + */ + __pyx_t_6 = (__pyx_v_word == Py_None); + __pyx_t_8 = (__pyx_t_6 != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":492 + * word = vlookup[token] if token in vlookup else None + * if word is None: + * continue # should drop the # <<<<<<<<<<<<<< + * indexes[i] = word.index + * codelens[i] = len(word.code) + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":491 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # should drop the + * indexes[i] = word.index + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":493 + * if word is None: + * continue # should drop the + * indexes[i] = word.index # <<<<<<<<<<<<<< + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = __Pyx_PyInt_As_npy_uint32(__pyx_t_5); if (unlikely((__pyx_t_9 == (npy_uint32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_indexes[__pyx_v_i]) = __pyx_t_9; + + /* "gensim/models/word2vec_inner_synt2.pyx":494 + * continue # should drop the + * indexes[i] = word.index + * codelens[i] = len(word.code) # <<<<<<<<<<<<<< + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_codelens[__pyx_v_i]) = ((int)__pyx_t_10); + + /* "gensim/models/word2vec_inner_synt2.pyx":495 + * indexes[i] = word.index + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) # <<<<<<<<<<<<<< + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_i]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":496 + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) # <<<<<<<<<<<<<< + * result += 1 + * i += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_i]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":497 + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + * result += 1 # <<<<<<<<<<<<<< + * i += 1 + * if i == MAX_SENTENCE_LEN: + */ + __pyx_v_result = (__pyx_v_result + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":498 + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + * i += 1 # <<<<<<<<<<<<<< + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":499 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + __pyx_t_8 = ((__pyx_v_i == 0x2710) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":500 + * i += 1 + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< + * sentence_len = i + * + */ + goto __pyx_L4_break; + + /* "gensim/models/word2vec_inner_synt2.pyx":499 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":489 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + __pyx_L3_continue:; + } + __pyx_L4_break:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":501 + * 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_synt2.pyx":504 + * + * # release GIL & train on the sentence + * work[0] = 0.0 # <<<<<<<<<<<<<< + * + * with nogil: + */ + (__pyx_v_work[0]) = 0.0; + + /* "gensim/models/word2vec_inner_synt2.pyx":506 + * work[0] = 0.0 + * + * with nogil: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + #endif + /*try:*/ { + + /* "gensim/models/word2vec_inner_synt2.pyx":507 + * + * with nogil: + * for i in range(sentence_len): # <<<<<<<<<<<<<< + * if codelens[i] == 0: + * continue + */ + __pyx_t_2 = __pyx_v_sentence_len; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_2; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "gensim/models/word2vec_inner_synt2.pyx":508 + * with nogil: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + __pyx_t_8 = (((__pyx_v_codelens[__pyx_v_i]) == 0) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":509 + * for i in range(sentence_len): + * if codelens[i] == 0: + * continue # <<<<<<<<<<<<<< + * j = i - window + * if j < 0: + */ + goto __pyx_L10_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":508 + * with nogil: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":510 + * if codelens[i] == 0: + * continue + * j = i - window # <<<<<<<<<<<<<< + * if j < 0: + * j = 0 + */ + __pyx_v_j = (__pyx_v_i - __pyx_v_window); + + /* "gensim/models/word2vec_inner_synt2.pyx":511 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + __pyx_t_8 = ((__pyx_v_j < 0) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":512 + * j = i - window + * if j < 0: + * j = 0 # <<<<<<<<<<<<<< + * k = i + window + 1 + * if k > sentence_len: + */ + __pyx_v_j = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":511 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":513 + * if j < 0: + * j = 0 + * k = i + window + 1 # <<<<<<<<<<<<<< + * if k > sentence_len: + * k = sentence_len + */ + __pyx_v_k = ((__pyx_v_i + __pyx_v_window) + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":514 + * j = 0 + * k = i + window + 1 + * if k > sentence_len: # <<<<<<<<<<<<<< + * k = sentence_len + * for j in range(j, k): + */ + __pyx_t_8 = ((__pyx_v_k > __pyx_v_sentence_len) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":515 + * k = i + window + 1 + * if k > sentence_len: + * k = sentence_len # <<<<<<<<<<<<<< + * for j in range(j, k): + * if j == i or codelens[j] == 0: + */ + __pyx_v_k = __pyx_v_sentence_len; + + /* "gensim/models/word2vec_inner_synt2.pyx":514 + * j = 0 + * k = i + window + 1 + * if k > sentence_len: # <<<<<<<<<<<<<< + * k = sentence_len + * for j in range(j, k): + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":516 + * if k > sentence_len: + * k = sentence_len + * for j in range(j, k): # <<<<<<<<<<<<<< + * if j == i or codelens[j] == 0: + * continue + */ + __pyx_t_12 = __pyx_v_k; + for (__pyx_t_13 = __pyx_v_j; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "gensim/models/word2vec_inner_synt2.pyx":517 + * k = sentence_len + * for j in range(j, k): + * if j == i or codelens[j] == 0: # <<<<<<<<<<<<<< + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + */ + __pyx_t_6 = ((__pyx_v_j == __pyx_v_i) != 0); + if (!__pyx_t_6) { + } else { + __pyx_t_8 = __pyx_t_6; + goto __pyx_L18_bool_binop_done; + } + __pyx_t_6 = (((__pyx_v_codelens[__pyx_v_j]) == 0) != 0); + __pyx_t_8 = __pyx_t_6; + __pyx_L18_bool_binop_done:; + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":518 + * for j in range(j, k): + * 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; + + /* "gensim/models/word2vec_inner_synt2.pyx":517 + * k = sentence_len + * for j in range(j, k): + * if j == i or codelens[j] == 0: # <<<<<<<<<<<<<< + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":519 + * 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_20word2vec_inner_synt2_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); + __pyx_L15_continue:; + } + __pyx_L10_continue:; + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":506 + * work[0] = 0.0 + * + * with nogil: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + Py_BLOCK_THREADS + #endif + goto __pyx_L9; + } + __pyx_L9:; + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":521 + * 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); + __pyx_t_1 = PyFloat_FromDouble((__pyx_v_work[0])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "gensim/models/word2vec_inner_synt2.pyx":464 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.score_sentence_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":523 + * 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, + */ + +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_score_pair_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_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const __pyx_v_word2_index, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + PY_LONG_LONG __pyx_v_sgn; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_f; + int __pyx_t_1; + PY_LONG_LONG __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + long __pyx_t_5; + + /* "gensim/models/word2vec_inner_synt2.pyx":529 + * + * 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_synt2.pyx":532 + * cdef REAL_t f + * + * for b in range(codelen): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + */ + __pyx_t_1 = __pyx_v_codelen; + for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_b = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":533 + * + * for b in range(codelen): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":534 + * for b in range(codelen): + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + */ + __pyx_v_f = __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot((&__pyx_v_size), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":535 + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 # <<<<<<<<<<<<<< + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_sgn = __Pyx_pow_long(-1L, ((long)(__pyx_v_word_code[__pyx_v_b]))); + + /* "gensim/models/word2vec_inner_synt2.pyx":536 + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = (__pyx_v_sgn * __pyx_v_f); + + /* "gensim/models/word2vec_inner_synt2.pyx":537 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L6_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":538 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * work[0] += f + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":537 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":539 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * work[0] += f + * + */ + __pyx_v_f = (__pyx_v_6gensim_6models_20word2vec_inner_synt2_LOG_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "gensim/models/word2vec_inner_synt2.pyx":540 + * 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; + (__pyx_v_work[__pyx_t_5]) = ((__pyx_v_work[__pyx_t_5]) + __pyx_v_f); + __pyx_L3_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":523 + * 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, + */ + + /* function exit code */ +} + +/* "gensim/models/word2vec_inner_synt2.pyx":542 + * work[0] += f + * + * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< + * + * cdef int cbow_mean = model.cbow_mean + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_7score_sentence_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_6gensim_6models_20word2vec_inner_synt2_7score_sentence_cbow = {"score_sentence_cbow", (PyCFunction)__pyx_pw_6gensim_6models_20word2vec_inner_synt2_7score_sentence_cbow, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_7score_sentence_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_model = 0; + PyObject *__pyx_v_sentence = 0; + PyObject *__pyx_v__work = 0; + PyObject *__pyx_v__neu1 = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("score_sentence_cbow (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_model,&__pyx_n_s_sentence,&__pyx_n_s_work,&__pyx_n_s_neu1,0}; + PyObject* values[4] = {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 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_sentence)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_work)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_neu1)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "score_sentence_cbow") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentence = values[1]; + __pyx_v__work = values[2]; + __pyx_v__neu1 = values[3]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.score_sentence_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_6gensim_6models_20word2vec_inner_synt2_6score_sentence_cbow(__pyx_self, __pyx_v_model, __pyx_v_sentence, __pyx_v__work, __pyx_v__neu1); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_6score_sentence_cbow(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work, PyObject *__pyx_v__neu1) { + int __pyx_v_cbow_mean; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_neu1; + int __pyx_v_size; + int __pyx_v_codelens[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_indexes[0x2710]; + int __pyx_v_sentence_len; + int __pyx_v_window; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + long __pyx_v_result; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn1; + __pyx_t_5numpy_uint32_t *__pyx_v_points[0x2710]; + __pyx_t_5numpy_uint8_t *__pyx_v_codes[0x2710]; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + __pyx_t_5numpy_uint32_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("score_sentence_cbow", 0); + + /* "gensim/models/word2vec_inner_synt2.pyx":544 + * def score_sentence_cbow(model, sentence, _work, _neu1): + * + * cdef int cbow_mean = model.cbow_mean # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cbow_mean); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_cbow_mean = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":546 + * cdef int cbow_mean = model.cbow_mean + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef REAL_t *neu1 + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":549 + * cdef REAL_t *work + * cdef REAL_t *neu1 + * 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_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_size = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":554 + * cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + * cdef int sentence_len + * 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_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_window = __pyx_t_2; + + /* "gensim/models/word2vec_inner_synt2.pyx":557 + * + * cdef int i, j, k + * cdef long result = 0 # <<<<<<<<<<<<<< + * + * # For hierarchical softmax + */ + __pyx_v_result = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":564 + * 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_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":567 + * + * # 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_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "gensim/models/word2vec_inner_synt2.pyx":568 + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) + * neu1 = np.PyArray_DATA(_neu1) # <<<<<<<<<<<<<< + * + * vlookup = model.vocab + */ + if (!(likely(((__pyx_v__neu1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__neu1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_neu1 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__neu1))); + + /* "gensim/models/word2vec_inner_synt2.pyx":570 + * neu1 = np.PyArray_DATA(_neu1) + * + * vlookup = model.vocab # <<<<<<<<<<<<<< + * i = 0 + * for token in sentence: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_vocab); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_vlookup = __pyx_t_1; + __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":571 + * + * vlookup = model.vocab + * i = 0 # <<<<<<<<<<<<<< + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + */ + __pyx_v_i = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":572 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + if (likely(PyList_CheckExact(__pyx_v_sentence)) || PyTuple_CheckExact(__pyx_v_sentence)) { + __pyx_t_1 = __pyx_v_sentence; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_1); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_5); + __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":573 + * i = 0 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None # <<<<<<<<<<<<<< + * if word is None: + * continue # for score, should this be a default negative value? + */ + __pyx_t_6 = (__Pyx_PySequence_ContainsTF(__pyx_v_token, __pyx_v_vlookup, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_6 != 0)) { + __pyx_t_7 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 573; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = __pyx_t_7; + __pyx_t_7 = 0; + } else { + __Pyx_INCREF(Py_None); + __pyx_t_5 = Py_None; + } + __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_5); + __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":574 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # for score, should this be a default negative value? + * indexes[i] = word.index + */ + __pyx_t_6 = (__pyx_v_word == Py_None); + __pyx_t_8 = (__pyx_t_6 != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":575 + * word = vlookup[token] if token in vlookup else None + * if word is None: + * continue # for score, should this be a default negative value? # <<<<<<<<<<<<<< + * indexes[i] = word.index + * codelens[i] = len(word.code) + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":574 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # for score, should this be a default negative value? + * indexes[i] = word.index + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":576 + * if word is None: + * continue # for score, should this be a default negative value? + * indexes[i] = word.index # <<<<<<<<<<<<<< + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = __Pyx_PyInt_As_npy_uint32(__pyx_t_5); if (unlikely((__pyx_t_9 == (npy_uint32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_indexes[__pyx_v_i]) = __pyx_t_9; + + /* "gensim/models/word2vec_inner_synt2.pyx":577 + * continue # for score, should this be a default negative value? + * indexes[i] = word.index + * codelens[i] = len(word.code) # <<<<<<<<<<<<<< + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_codelens[__pyx_v_i]) = ((int)__pyx_t_10); + + /* "gensim/models/word2vec_inner_synt2.pyx":578 + * indexes[i] = word.index + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) # <<<<<<<<<<<<<< + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_i]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":579 + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) # <<<<<<<<<<<<<< + * result += 1 + * i += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_i]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":580 + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + * result += 1 # <<<<<<<<<<<<<< + * i += 1 + * if i == MAX_SENTENCE_LEN: + */ + __pyx_v_result = (__pyx_v_result + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":581 + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + * i += 1 # <<<<<<<<<<<<<< + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":582 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + __pyx_t_8 = ((__pyx_v_i == 0x2710) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":583 + * i += 1 + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< + * sentence_len = i + * + */ + goto __pyx_L4_break; + + /* "gensim/models/word2vec_inner_synt2.pyx":582 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":572 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + __pyx_L3_continue:; + } + __pyx_L4_break:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":584 + * 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_synt2.pyx":587 + * + * # release GIL & train on the sentence + * work[0] = 0.0 # <<<<<<<<<<<<<< + * with nogil: + * for i in range(sentence_len): + */ + (__pyx_v_work[0]) = 0.0; + + /* "gensim/models/word2vec_inner_synt2.pyx":588 + * # release GIL & train on the sentence + * work[0] = 0.0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + #endif + /*try:*/ { + + /* "gensim/models/word2vec_inner_synt2.pyx":589 + * work[0] = 0.0 + * with nogil: + * for i in range(sentence_len): # <<<<<<<<<<<<<< + * if codelens[i] == 0: + * continue + */ + __pyx_t_2 = __pyx_v_sentence_len; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_2; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "gensim/models/word2vec_inner_synt2.pyx":590 + * with nogil: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + __pyx_t_8 = (((__pyx_v_codelens[__pyx_v_i]) == 0) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":591 + * for i in range(sentence_len): + * if codelens[i] == 0: + * continue # <<<<<<<<<<<<<< + * j = i - window + * if j < 0: + */ + goto __pyx_L10_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":590 + * with nogil: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":592 + * if codelens[i] == 0: + * continue + * j = i - window # <<<<<<<<<<<<<< + * if j < 0: + * j = 0 + */ + __pyx_v_j = (__pyx_v_i - __pyx_v_window); + + /* "gensim/models/word2vec_inner_synt2.pyx":593 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + __pyx_t_8 = ((__pyx_v_j < 0) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":594 + * j = i - window + * if j < 0: + * j = 0 # <<<<<<<<<<<<<< + * k = i + window + 1 + * if k > sentence_len: + */ + __pyx_v_j = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":593 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":595 + * if j < 0: + * j = 0 + * k = i + window + 1 # <<<<<<<<<<<<<< + * if k > sentence_len: + * k = sentence_len + */ + __pyx_v_k = ((__pyx_v_i + __pyx_v_window) + 1); + + /* "gensim/models/word2vec_inner_synt2.pyx":596 + * j = 0 + * k = i + window + 1 + * 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_t_8 = ((__pyx_v_k > __pyx_v_sentence_len) != 0); + if (__pyx_t_8) { + + /* "gensim/models/word2vec_inner_synt2.pyx":597 + * k = i + window + 1 + * 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; + + /* "gensim/models/word2vec_inner_synt2.pyx":596 + * j = 0 + * k = i + window + 1 + * 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) + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":598 + * 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_20word2vec_inner_synt2_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); + __pyx_L10_continue:; + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":588 + * # release GIL & train on the sentence + * work[0] = 0.0 + * with nogil: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + Py_BLOCK_THREADS + #endif + goto __pyx_L9; + } + __pyx_L9:; + } + } + + /* "gensim/models/word2vec_inner_synt2.pyx":600 + * 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); + __pyx_t_1 = PyFloat_FromDouble((__pyx_v_work[0])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "gensim/models/word2vec_inner_synt2.pyx":542 + * work[0] += f + * + * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< + * + * cdef int cbow_mean = model.cbow_mean + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2.score_sentence_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "gensim/models/word2vec_inner_synt2.pyx":602 + * 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, + */ + +static void __pyx_f_6gensim_6models_20word2vec_inner_synt2_score_pair_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_20word2vec_inner_synt2_REAL_t *__pyx_v_neu1, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn0, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t *__pyx_v_work, int __pyx_v_i, int __pyx_v_j, int __pyx_v_k, int __pyx_v_cbow_mean) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_f; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_count; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_inv_count; + __pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t __pyx_v_sgn; + int __pyx_v_m; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PY_LONG_LONG __pyx_t_5; + long __pyx_t_6; + + /* "gensim/models/word2vec_inner_synt2.pyx":613 + * 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_20word2vec_inner_synt2_REAL_t)))); + + /* "gensim/models/word2vec_inner_synt2.pyx":614 + * + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 # <<<<<<<<<<<<<< + * for m in range(j, k): + * if m == i or codelens[m] == 0: + */ + __pyx_v_count = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)0.0); + + /* "gensim/models/word2vec_inner_synt2.pyx":615 + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 + * for m in range(j, k): # <<<<<<<<<<<<<< + * if m == i or codelens[m] == 0: + * 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/word2vec_inner_synt2.pyx":616 + * count = 0.0 + * for m in range(j, k): + * if m == i or codelens[m] == 0: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_4 = ((__pyx_v_m == __pyx_v_i) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_4 = (((__pyx_v_codelens[__pyx_v_m]) == 0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L6_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":617 + * for m in range(j, k): + * if m == i or codelens[m] == 0: + * continue # <<<<<<<<<<<<<< + * else: + * count += ONEF + */ + goto __pyx_L3_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":616 + * count = 0.0 + * for m in range(j, k): + * if m == i or codelens[m] == 0: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":619 + * continue + * else: + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + */ + /*else*/ { + __pyx_v_count = (__pyx_v_count + __pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF); + + /* "gensim/models/word2vec_inner_synt2.pyx":620 + * else: + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * if count > (0.5): + * inv_count = ONEF/count + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy((&__pyx_v_size), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + } + __pyx_L3_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":621 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * 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_20word2vec_inner_synt2_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":622 + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * 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_20word2vec_inner_synt2_ONEF / __pyx_v_count); + + /* "gensim/models/word2vec_inner_synt2.pyx":621 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":623 + * 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/word2vec_inner_synt2.pyx":624 + * inv_count = ONEF/count + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # <<<<<<<<<<<<<< + * + * for b in range(codelens[i]): + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":623 + * if count > (0.5): + * inv_count = ONEF/count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) + * + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":626 + * 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) + */ + __pyx_t_1 = (__pyx_v_codelens[__pyx_v_i]); + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_1; __pyx_t_5+=1) { + __pyx_v_b = __pyx_t_5; + + /* "gensim/models/word2vec_inner_synt2.pyx":627 + * + * for b in range(codelens[i]): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "gensim/models/word2vec_inner_synt2.pyx":628 + * for b in range(codelens[i]): + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + */ + __pyx_v_f = __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":629 + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 # <<<<<<<<<<<<<< + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_sgn = __Pyx_pow_long(-1L, ((long)(__pyx_v_word_code[__pyx_v_b]))); + + /* "gensim/models/word2vec_inner_synt2.pyx":630 + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = (__pyx_v_sgn * __pyx_v_f); + + /* "gensim/models/word2vec_inner_synt2.pyx":631 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L13_bool_binop_done:; + if (__pyx_t_3) { + + /* "gensim/models/word2vec_inner_synt2.pyx":632 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * work[0] += f + */ + goto __pyx_L10_continue; + + /* "gensim/models/word2vec_inner_synt2.pyx":631 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":633 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * work[0] += f + * + */ + __pyx_v_f = (__pyx_v_6gensim_6models_20word2vec_inner_synt2_LOG_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "gensim/models/word2vec_inner_synt2.pyx":634 + * 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); + __pyx_L10_continue:; + } + + /* "gensim/models/word2vec_inner_synt2.pyx":602 + * 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, + */ + + /* function exit code */ +} + +/* "gensim/models/word2vec_inner_synt2.pyx":637 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_9init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_6gensim_6models_20word2vec_inner_synt2_8init[] = "\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\n "; +static PyMethodDef __pyx_mdef_6gensim_6models_20word2vec_inner_synt2_9init = {"init", (PyCFunction)__pyx_pw_6gensim_6models_20word2vec_inner_synt2_9init, METH_NOARGS, __pyx_doc_6gensim_6models_20word2vec_inner_synt2_8init}; +static PyObject *__pyx_pw_6gensim_6models_20word2vec_inner_synt2_9init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("init (wrapper)", 0); + __pyx_r = __pyx_pf_6gensim_6models_20word2vec_inner_synt2_8init(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_6gensim_6models_20word2vec_inner_synt2_8init(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/word2vec_inner_synt2.pyx":647 + * + * 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/word2vec_inner_synt2.pyx":648 + * 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/word2vec_inner_synt2.pyx":649 + * 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/word2vec_inner_synt2.pyx":650 + * 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/word2vec_inner_synt2.pyx":655 + * + * # 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/word2vec_inner_synt2.pyx":656 + * # 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_20word2vec_inner_synt2_EXP_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)exp(((((__pyx_v_i / ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)0x3E8)) * 2.0) - 1.0) * 6.0))); + + /* "gensim/models/word2vec_inner_synt2.pyx":657 + * 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_20word2vec_inner_synt2_EXP_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)((__pyx_v_6gensim_6models_20word2vec_inner_synt2_EXP_TABLE[__pyx_v_i]) / ((__pyx_v_6gensim_6models_20word2vec_inner_synt2_EXP_TABLE[__pyx_v_i]) + 1.0))); + + /* "gensim/models/word2vec_inner_synt2.pyx":658 + * 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_20word2vec_inner_synt2_LOG_TABLE[__pyx_v_i]) = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)log((__pyx_v_6gensim_6models_20word2vec_inner_synt2_EXP_TABLE[__pyx_v_i]))); + } + + /* "gensim/models/word2vec_inner_synt2.pyx":661 + * + * # 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_20word2vec_inner_synt2_dsdot((&__pyx_v_size), __pyx_v_x, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE), __pyx_v_y, (&__pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE)); + + /* "gensim/models/word2vec_inner_synt2.pyx":662 + * # 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/word2vec_inner_synt2.pyx":663 + * 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/word2vec_inner_synt2.pyx":664 + * 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_20word2vec_inner_synt2_our_dot = __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_double; + + /* "gensim/models/word2vec_inner_synt2.pyx":665 + * 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_20word2vec_inner_synt2_our_saxpy = __pyx_v_6gensim_6models_20word2vec_inner_synt2_saxpy; + + /* "gensim/models/word2vec_inner_synt2.pyx":666 + * 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/word2vec_inner_synt2.pyx":663 + * 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/word2vec_inner_synt2.pyx":667 + * 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/word2vec_inner_synt2.pyx":668 + * 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_20word2vec_inner_synt2_our_dot = __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_float; + + /* "gensim/models/word2vec_inner_synt2.pyx":669 + * elif (abs(p_res[0] - expected) < 0.0001): + * our_dot = our_dot_float + * our_saxpy = saxpy # <<<<<<<<<<<<<< + * return 1 # float + * else: + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy = __pyx_v_6gensim_6models_20word2vec_inner_synt2_saxpy; + + /* "gensim/models/word2vec_inner_synt2.pyx":670 + * 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/word2vec_inner_synt2.pyx":667 + * our_saxpy = saxpy + * return 0 # double + * elif (abs(p_res[0] - expected) < 0.0001): # <<<<<<<<<<<<<< + * our_dot = our_dot_float + * our_saxpy = saxpy + */ + } + + /* "gensim/models/word2vec_inner_synt2.pyx":674 + * # 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_20word2vec_inner_synt2_our_dot = __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_noblas; + + /* "gensim/models/word2vec_inner_synt2.pyx":675 + * # 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_20word2vec_inner_synt2_our_saxpy = __pyx_f_6gensim_6models_20word2vec_inner_synt2_our_saxpy_noblas; + + /* "gensim/models/word2vec_inner_synt2.pyx":676 + * 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/word2vec_inner_synt2.pyx":637 + * + * + * 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; +} + +/* "../../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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __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); + } + + /* "../../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; + } + + /* "../../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; + + /* "../../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); + + /* "../../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); + + /* "../../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) { + + /* "../../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; + + /* "../../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; + } + + /* "../../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:; + + /* "../../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; + } + + /* "../../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:; + + /* "../../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) { + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../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") + */ + } + + /* "../../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; + } + + /* "../../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:; + + /* "../../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) { + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../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") + */ + } + + /* "../../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); + + /* "../../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; + + /* "../../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) { + + /* "../../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))); + + /* "../../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); + + /* "../../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; + + /* "../../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]); + + /* "../../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]); + } + + /* "../../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; + } + + /* "../../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)); + + /* "../../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:; + + /* "../../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; + + /* "../../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); + + /* "../../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)); + + /* "../../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; + + /* "../../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; + + /* "../../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); + + /* "../../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) { + + /* "../../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; + + /* "../../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; + } + + /* "../../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:; + + /* "../../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) { + + /* "../../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; + + /* "../../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:; + + /* "../../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:; + + /* "../../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) { + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../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") + */ + } + + /* "../../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 = __pyx_k_b; + break; + + /* "../../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 = __pyx_k_B; + break; + + /* "../../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 = __pyx_k_h; + break; + + /* "../../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 = __pyx_k_H; + break; + + /* "../../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 = __pyx_k_i; + break; + + /* "../../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 = __pyx_k_I; + break; + + /* "../../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 = __pyx_k_l; + break; + + /* "../../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 = __pyx_k_L; + break; + + /* "../../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 = __pyx_k_q; + break; + + /* "../../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 = __pyx_k_Q; + break; + + /* "../../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 = __pyx_k_f; + break; + + /* "../../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 = __pyx_k_d; + break; + + /* "../../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 = __pyx_k_g; + break; + + /* "../../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 = __pyx_k_Zf; + break; + + /* "../../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 = __pyx_k_Zd; + break; + + /* "../../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 = __pyx_k_Zg; + break; + + /* "../../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 = __pyx_k_O; + break; + default: + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + break; + } + + /* "../../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; + + /* "../../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; + + /* "../../Cython/Includes/numpy/__init__.pxd":255 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + } + + /* "../../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)); + + /* "../../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]) = '^'; + + /* "../../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; + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_7; + + /* "../../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'; + } + + /* "../../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; +} + +/* "../../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); + + /* "../../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) { + + /* "../../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); + + /* "../../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): + */ + } + + /* "../../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) { + + /* "../../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); + + /* "../../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 + */ + } + + /* "../../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(); +} + +/* "../../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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../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; +} + +/* "../../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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../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; +} + +/* "../../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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../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; +} + +/* "../../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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../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; +} + +/* "../../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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../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; +} + +/* "../../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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../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; + + /* "../../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); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __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_COMPILING_IN_CPYTHON + __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_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../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_CPYTHON + 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_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if CYTHON_COMPILING_IN_CPYTHON + __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_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __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; + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __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) { + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../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") + * + */ + } + + /* "../../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:; + + /* "../../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:; + + /* "../../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) { + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../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") + */ + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../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; + + /* "../../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); + + /* "../../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); + } + + /* "../../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); + + /* "../../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) { + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../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) { + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../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.") + * + */ + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __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; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __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; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __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; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_L15:; + + /* "../../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); + + /* "../../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; + } + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../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; + + /* "../../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; + + /* "../../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; +} + +/* "../../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); + + /* "../../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) { + + /* "../../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; + + /* "../../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; + } + + /* "../../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); + + /* "../../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:; + + /* "../../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); + + /* "../../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; + + /* "../../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(); +} + +/* "../../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); + + /* "../../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) { + + /* "../../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; + + /* "../../Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../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; + } + + /* "../../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; +} + +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 + "word2vec_inner_synt2", + 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_EXP_TABLE, __pyx_k_EXP_TABLE, sizeof(__pyx_k_EXP_TABLE), 0, 0, 1, 1}, + {&__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__11, __pyx_k__11, sizeof(__pyx_k__11), 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_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_cpointer, __pyx_k_cpointer, sizeof(__pyx_k_cpointer), 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_dsdot, __pyx_k_dsdot, sizeof(__pyx_k_dsdot), 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_word2vec_inner_syn, __pyx_k_gensim_models_word2vec_inner_syn, sizeof(__pyx_k_gensim_models_word2vec_inner_syn), 0, 0, 1, 1}, + {&__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_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_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_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_n_s_our_dot, __pyx_k_our_dot, sizeof(__pyx_k_our_dot), 0, 0, 1, 1}, + {&__pyx_n_s_our_saxpy, __pyx_k_our_saxpy, sizeof(__pyx_k_our_saxpy), 0, 0, 1, 1}, + {&__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_pyx_capi, __pyx_k_pyx_capi, sizeof(__pyx_k_pyx_capi), 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_result, __pyx_k_result, sizeof(__pyx_k_result), 0, 0, 1, 1}, + {&__pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_k_run_media_robert_1TB_1_linuxfol, sizeof(__pyx_k_run_media_robert_1TB_1_linuxfol), 0, 0, 1, 0}, + {&__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_saxpy, __pyx_k_saxpy, sizeof(__pyx_k_saxpy), 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_scopy, __pyx_k_scopy, sizeof(__pyx_k_scopy), 0, 0, 1, 1}, + {&__pyx_n_s_score_sentence_cbow, __pyx_k_score_sentence_cbow, sizeof(__pyx_k_score_sentence_cbow), 0, 0, 1, 1}, + {&__pyx_n_s_score_sentence_sg, __pyx_k_score_sentence_sg, sizeof(__pyx_k_score_sentence_sg), 0, 0, 1, 1}, + {&__pyx_n_s_sdot, __pyx_k_sdot, sizeof(__pyx_k_sdot), 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, __pyx_k_sentence, sizeof(__pyx_k_sentence), 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_sentence_len, __pyx_k_sentence_len, sizeof(__pyx_k_sentence_len), 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_snrm2, __pyx_k_snrm2, sizeof(__pyx_k_snrm2), 0, 0, 1, 1}, + {&__pyx_n_s_sscal, __pyx_k_sscal, sizeof(__pyx_k_sscal), 0, 0, 1, 1}, + {&__pyx_n_s_syn0, __pyx_k_syn0, sizeof(__pyx_k_syn0), 0, 0, 1, 1}, + {&__pyx_n_s_syn0_lockf, __pyx_k_syn0_lockf, sizeof(__pyx_k_syn0_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_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, __pyx_k_word_locks, sizeof(__pyx_k_word_locks), 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_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_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "gensim/models/word2vec_inner_synt2.pyx":298 + * 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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "gensim/models/word2vec_inner_synt2.pyx":403 + * 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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../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_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "gensim/models/word2vec_inner_synt2.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_tuple__12 = PyTuple_Pack(37, __pyx_n_s_model, __pyx_n_s_sentences, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __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__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(4, 0, 37, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_train_batch_sg, 257, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "gensim/models/word2vec_inner_synt2.pyx":361 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_tuple__14 = PyTuple_Pack(40, __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, __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__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(5, 0, 40, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_train_batch_cbow, 361, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "gensim/models/word2vec_inner_synt2.pyx":464 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_tuple__16 = 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__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 20, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_score_sentence_sg, 464, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "gensim/models/word2vec_inner_synt2.pyx":542 + * work[0] += f + * + * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< + * + * cdef int cbow_mean = model.cbow_mean + */ + __pyx_tuple__18 = 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__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(4, 0, 23, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_score_sentence_cbow, 542, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "gensim/models/word2vec_inner_synt2.pyx":637 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + __pyx_tuple__20 = 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__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(0, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_init, 637, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_10000 = PyInt_FromLong(10000L); if (unlikely(!__pyx_int_10000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_16777216 = PyInt_FromLong(16777216L); if (unlikely(!__pyx_int_16777216)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC initword2vec_inner_synt2(void); /*proto*/ +PyMODINIT_FUNC initword2vec_inner_synt2(void) +#else +PyMODINIT_FUNC PyInit_word2vec_inner_synt2(void); /*proto*/ +PyMODINIT_FUNC PyInit_word2vec_inner_synt2(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; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __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_word2vec_inner_synt2(void)", 0); + if (__Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __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("word2vec_inner_synt2", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + if (__pyx_module_is_main_gensim__models__word2vec_inner_synt2) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!PyDict_GetItemString(modules, "gensim.models.word2vec_inner_synt2")) { + if (unlikely(PyDict_SetItemString(modules, "gensim.models.word2vec_inner_synt2", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + if (__Pyx_ExportVoidPtr(__pyx_n_s_scopy, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_scopy, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_scopy_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_saxpy, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_saxpy, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_saxpy_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_sdot, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_sdot, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_sdot_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_dsdot, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_dsdot, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_dsdot_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_snrm2, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_snrm2, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_snrm2_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_sscal, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_sscal, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_sscal_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_EXP_TABLE, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_EXP_TABLE, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t [0x3E8]") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_our_dot, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_our_dot, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_our_dot_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_our_saxpy, (void *)&__pyx_v_6gensim_6models_20word2vec_inner_synt2_our_saxpy, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_our_saxpy_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Function export code ---*/ + if (__Pyx_ExportFunction("our_dot_double", (void (*)(void))__pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_double, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("our_dot_float", (void (*)(void))__pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_float, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("our_dot_noblas", (void (*)(void))__pyx_f_6gensim_6models_20word2vec_inner_synt2_our_dot_noblas, "__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("our_saxpy_noblas", (void (*)(void))__pyx_f_6gensim_6models_20word2vec_inner_synt2_our_saxpy_noblas, "void (int const *, float const *, float const *, int const *, float *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("bisect_left", (void (*)(void))__pyx_f_6gensim_6models_20word2vec_inner_synt2_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_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("random_int32", (void (*)(void))__pyx_f_6gensim_6models_20word2vec_inner_synt2_random_int32, "unsigned PY_LONG_LONG (unsigned PY_LONG_LONG *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- 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_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Variable import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + + /* "gensim/models/word2vec_inner_synt2.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_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":19 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + { + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "gensim/models/word2vec_inner_synt2.pyx":20 + * # scipy <= 0.15 + * try: + * from scipy.linalg.blas import fblas # <<<<<<<<<<<<<< + * except ImportError: + * # in scipy > 0.15, fblas function has been removed + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_fblas); + __Pyx_GIVEREF(__pyx_n_s_fblas); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_fblas); + __pyx_t_5 = __Pyx_Import(__pyx_n_s_scipy_linalg_blas, __pyx_t_1, -1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_5, __pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fblas, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":19 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + } + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L9_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":21 + * 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_6 = PyErr_ExceptionMatches(__pyx_builtin_ImportError); + if (__pyx_t_6) { + __Pyx_AddTraceback("gensim.models.word2vec_inner_synt2", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_1, &__pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_7); + + /* "gensim/models/word2vec_inner_synt2.pyx":23 + * 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_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_n_s__11); + __Pyx_GIVEREF(__pyx_n_s__11); + PyList_SET_ITEM(__pyx_t_8, 0, __pyx_n_s__11); + __pyx_t_9 = __Pyx_Import(__pyx_n_s_scipy_linalg_blas, __pyx_t_8, -1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fblas, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + goto __pyx_L4_except_error; + __pyx_L4_except_error:; + + /* "gensim/models/word2vec_inner_synt2.pyx":19 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + __pyx_L9_try_end:; + } + + /* "gensim/models/word2vec_inner_synt2.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_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_float32); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_REAL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.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) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_scopy); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_6gensim_6models_20word2vec_inner_synt2_scopy = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_scopy_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.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) + * cdef dsdot_ptr dsdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # double = dot(x, y) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_saxpy); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_6gensim_6models_20word2vec_inner_synt2_saxpy = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_saxpy_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":31 + * 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) # <<<<<<<<<<<<<< + * 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) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sdot); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_6gensim_6models_20word2vec_inner_synt2_sdot = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_sdot_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":32 + * 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) + * 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_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sdot); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_6gensim_6models_20word2vec_inner_synt2_dsdot = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_dsdot_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":33 + * cdef sdot_ptr sdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # float = dot(x, y) + * 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_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_snrm2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_6gensim_6models_20word2vec_inner_synt2_snrm2 = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_snrm2_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":34 + * 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_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sscal); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_6gensim_6models_20word2vec_inner_synt2_sscal = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_sscal_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":42 + * cdef REAL_t[EXP_TABLE_SIZE] LOG_TABLE + * + * cdef int ONE = 1 # <<<<<<<<<<<<<< + * cdef REAL_t ONEF = 1.0 + * + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_ONE = 1; + + /* "gensim/models/word2vec_inner_synt2.pyx":43 + * + * cdef int ONE = 1 + * cdef REAL_t ONEF = 1.0 # <<<<<<<<<<<<<< + * + * # for when fblas.sdot returns a double + */ + __pyx_v_6gensim_6models_20word2vec_inner_synt2_ONEF = ((__pyx_t_6gensim_6models_20word2vec_inner_synt2_REAL_t)1.0); + + /* "gensim/models/word2vec_inner_synt2.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_20word2vec_inner_synt2_1train_batch_sg, NULL, __pyx_n_s_gensim_models_word2vec_inner_syn); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_train_batch_sg, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":361 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_20word2vec_inner_synt2_3train_batch_cbow, NULL, __pyx_n_s_gensim_models_word2vec_inner_syn); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_train_batch_cbow, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":464 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_20word2vec_inner_synt2_5score_sentence_sg, NULL, __pyx_n_s_gensim_models_word2vec_inner_syn); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_score_sentence_sg, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":542 + * 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_20word2vec_inner_synt2_7score_sentence_cbow, NULL, __pyx_n_s_gensim_models_word2vec_inner_syn); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_score_sentence_cbow, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":637 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_6gensim_6models_20word2vec_inner_synt2_9init, NULL, __pyx_n_s_gensim_models_word2vec_inner_syn); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_init, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":678 + * return 2 + * + * FAST_VERSION = init() # initialize the module # <<<<<<<<<<<<<< + * MAX_WORDS_IN_BATCH = MAX_SENTENCE_LEN + */ + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_init); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (__pyx_t_5) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else { + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FAST_VERSION, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 678; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "gensim/models/word2vec_inner_synt2.pyx":679 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 679; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "gensim/models/word2vec_inner_synt2.pyx":1 + * #!/usr/bin/env cython # <<<<<<<<<<<<<< + * # cython: boundscheck=False + * # cython: wraparound=False + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init gensim.models.word2vec_inner_synt2", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init gensim.models.word2vec_inner_synt2"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* --- Runtime support code --- */ +#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 + +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; +} + +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); +} + +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 +} + +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; +} + +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; +} + +#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 + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + 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); +#else + PyErr_Restore(type, value, tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(type, value, tb); +#endif +} + +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + 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_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 + +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); +} + +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"); +} + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +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; +} + +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; +} + +static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +#else + PyErr_GetExcInfo(type, value, tb); +#endif +} +static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + 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); +#else + PyErr_SetExcInfo(type, value, tb); +#endif +} + +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + 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_COMPILING_IN_CPYTHON + 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_COMPILING_IN_CPYTHON + 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; +} + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON + 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; +} + +#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 + +#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) { +#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); + } + } + 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 + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { +#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 + +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); +} + +#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; + py_frame->f_lineno = py_line; + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +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); + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +#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;\ + } + +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" +#endif + +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)) + } 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)) + } + } 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) 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)) + } else if (sizeof(PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +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); + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +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)) + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } 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) 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)) + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +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)) + } 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)) + } + } 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) 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)) + } 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)) + } + } + { +#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_Int(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_Int(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; +} + +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); + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + 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); + } +} + +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)) + } else if (sizeof(npy_uint32) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } 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) 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)) + } else if (sizeof(npy_uint32) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +static CYTHON_INLINE long __Pyx_pow_long(long b, long e) { + long t = b; + switch (e) { + case 3: + t *= b; + case 2: + t *= b; + case 1: + return t; + case 0: + return 1; + } + #if 1 + if (unlikely(e<0)) return 0; + #endif + t = 1; + while (likely(e)) { + t *= (b * (e&1)) | ((~e)&1); + b *= b; + e >>= 1; + } + return t; +} + +#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 + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eqf(__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_sumf(__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_difff(__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_prodf(__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; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__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_zerof(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__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_absf(__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_powf(__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_prodf(a, a); + return __Pyx_c_prodf(a, a); + case 3: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, a); + case 4: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_absf(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 + +#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 + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq(__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(__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(__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(__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; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__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(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__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(__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(__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(a, a); + return __Pyx_c_prod(a, a); + case 3: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, a); + case 4: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_abs(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 + +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); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + 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); + } +} + +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)) + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } 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) 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)) + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +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; +} + +static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig) { + PyObject *d; + PyObject *cobj = 0; + d = PyDict_GetItem(__pyx_d, __pyx_n_s_pyx_capi); + Py_XINCREF(d); + if (!d) { + d = PyDict_New(); + if (!d) + goto bad; + if (__Pyx_PyObject_SetAttrStr(__pyx_m, __pyx_n_s_pyx_capi, d) < 0) + goto bad; + } +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(p, sig, 0); +#else + cobj = PyCObject_FromVoidPtrAndDesc(p, (void *)sig, 0); +#endif + if (!cobj) + goto bad; + if (PyDict_SetItem(d, name, cobj) < 0) + goto bad; + Py_DECREF(cobj); + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(cobj); + Py_XDECREF(d); + return -1; +} + +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { + PyObject *d = 0; + PyObject *cobj = 0; + union { + void (*fp)(void); + void *p; + } tmp; + d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__"); + if (!d) { + PyErr_Clear(); + d = PyDict_New(); + if (!d) + goto bad; + Py_INCREF(d); + if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0) + goto bad; + } + tmp.fp = f; +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(tmp.p, sig, 0); +#else + cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0); +#endif + if (!cobj) + goto bad; + if (PyDict_SetItemString(d, name, cobj) < 0) + goto bad; + Py_DECREF(cobj); + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(cobj); + Py_XDECREF(d); + return -1; +} + +#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 + +#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", + module_name, class_name); + 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", + module_name, class_name); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +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_Int(PyObject* x) { + PyNumberMethods *m; + 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); + 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 + 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/syntax_model_files/gensim/models/word2vec_inner_synt.pyx b/syntax_model_files/gensim/models/word2vec_inner_synt.pyx new file mode 100644 index 0000000000..be9f8264bf --- /dev/null +++ b/syntax_model_files/gensim/models/word2vec_inner_synt.pyx @@ -0,0 +1,679 @@ +#!/usr/bin/env cython +# cython: boundscheck=False +# cython: wraparound=False +# cython: cdivision=True +# coding: utf-8 +# +# Copyright (C) 2013 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + +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 + +REAL = np.float32 + +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) +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 +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 + +# 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 +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 +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 + cdef int i + cdef REAL_t a + a = 0.0 + for i from 0 <= i < N[0] by 1: + a += X[i] * Y[i] + return a + +# 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 + for i from 0 <= i < N[0] by 1: + Y[i * (incY[0])] = (alpha[0]) * X[i * (incX[0])] + Y[i * (incY[0])] + + +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, + const np.uint32_t word2_index, const REAL_t alpha, REAL_t *work, REAL_t *word_locks) nogil: + + cdef long long a, b + cdef long long row1 = word2_index * size, row2 + cdef REAL_t f, g + + memset(work, 0, size * cython.sizeof(REAL_t)) + for b in range(codelen): + row2 = word_point[b] * size + f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1[row2], &ONE) + our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) + + +# 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 + while hi > lo: + mid = (lo + hi) >> 1 + if a[mid] >= x: + hi = mid + else: + lo = mid + 1 + return lo + +# this quick & dirty RNG apparently matches Java's (non-Secure)Random +# note this function side-effects next_random to set up the next number +cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: + 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( + 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, + const np.uint32_t word2_index, const REAL_t alpha, REAL_t *work, + unsigned long long next_random, REAL_t *word_locks) nogil: + + cdef long long a + cdef long long row1 = word2_index * size, row2 + cdef unsigned long long modulo = 281474976710655ULL + cdef REAL_t f, g, label + cdef np.uint32_t target_index + cdef int d + + 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 = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + + our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &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, REAL_t *syn1, const int size, + const np.uint32_t indexes[MAX_SENTENCE_LEN], const REAL_t alpha, REAL_t *work, + int i, int j, int k, int cbow_mean, REAL_t *word_locks) nogil: + + cdef long long a, b + cdef long long row2 + cdef REAL_t f, g, count, inv_count = 1.0 + cdef int m + + memset(neu1, 0, size * cython.sizeof(REAL_t)) + count = 0.0 + for m in range(j, k): + if m == i: + continue + else: + count += ONEF + our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + if count > (0.5): + 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)) + for b in range(codelens[i]): + row2 = word_point[b] * size + f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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) # (does this need BLAS-variants like saxpy?) + + for m in range(j, k): + if m == i: + continue + else: + our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m] * 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, REAL_t *syn1neg, const int size, + const np.uint32_t indexes[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) 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 + 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 + else: + count += ONEF + our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + if count > (0.5): + 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)) + + 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 = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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) # (does this need BLAS-variants like saxpy?) + + for m in range(j,k): + if m == i: + continue + else: + our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) + + return next_random + + +def train_batch_sg(model, sentences, alpha, _work): + cdef int hs = model.hs + cdef int negative = model.negative + cdef int sample = (model.sample != 0) + + cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_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 + + 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) + + # prepare C structures so we can go "full C" and release the Python GIL + vlookup = model.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 + 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 # TODO: log warning, tally overflow? + + # 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[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + if negative: + next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + + 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 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_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 + + 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.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 + 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 # TODO: log warning, tally overflow? + + # 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, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + if negative: + next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + + return effective_words + + +# Score is only implemented for hierarchical softmax +def score_sentence_sg(model, sentence, _work): + + cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *work + cdef int size = model.layer1_size + + cdef int codelens[MAX_SENTENCE_LEN] + cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + cdef int sentence_len + cdef int window = model.window + + cdef int i, j, k + cdef long result = 0 + + cdef REAL_t *syn1 + cdef np.uint32_t *points[MAX_SENTENCE_LEN] + 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 + work = np.PyArray_DATA(_work) + + vlookup = model.vocab + i = 0 + for token in sentence: + word = vlookup[token] if token in vlookup else None + if word is None: + continue # should drop the + indexes[i] = word.index + codelens[i] = len(word.code) + codes[i] = np.PyArray_DATA(word.code) + points[i] = np.PyArray_DATA(word.point) + result += 1 + i += 1 + if i == MAX_SENTENCE_LEN: + break # TODO: log warning, tally overflow? + sentence_len = i + + # release GIL & train on the sentence + work[0] = 0.0 + + with nogil: + for i in range(sentence_len): + if codelens[i] == 0: + continue + j = i - window + if j < 0: + j = 0 + k = i + window + 1 + if k > sentence_len: + k = sentence_len + for j in range(j, k): + 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] + +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, + const np.uint32_t word2_index, REAL_t *work) nogil: + + cdef long long b + cdef long long row1 = word2_index * size, row2, sgn + cdef REAL_t f + + for b in range(codelen): + row2 = word_point[b] * size + f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + f = sgn*f + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + work[0] += f + +def score_sentence_cbow(model, sentence, _work, _neu1): + + cdef int cbow_mean = model.cbow_mean + + cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *work + cdef REAL_t *neu1 + cdef int size = model.layer1_size + + cdef int codelens[MAX_SENTENCE_LEN] + cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + cdef int sentence_len + cdef int window = model.window + + cdef int i, j, k + cdef long result = 0 + + # For hierarchical softmax + cdef REAL_t *syn1 + cdef np.uint32_t *points[MAX_SENTENCE_LEN] + 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 + work = np.PyArray_DATA(_work) + neu1 = np.PyArray_DATA(_neu1) + + vlookup = model.vocab + i = 0 + for token in sentence: + word = vlookup[token] if token in vlookup else None + if word is None: + continue # for score, should this be a default negative value? + indexes[i] = word.index + codelens[i] = len(word.code) + codes[i] = np.PyArray_DATA(word.code) + points[i] = np.PyArray_DATA(word.point) + result += 1 + i += 1 + if i == MAX_SENTENCE_LEN: + break # TODO: log warning, tally overflow? + sentence_len = i + + # release GIL & train on the sentence + work[0] = 0.0 + with nogil: + for i in range(sentence_len): + if codelens[i] == 0: + continue + j = i - window + if j < 0: + j = 0 + k = i + window + 1 + 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] + +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, + const np.uint32_t indexes[MAX_SENTENCE_LEN], REAL_t *work, + int i, int j, int k, int cbow_mean) nogil: + + cdef long long a, b + cdef long long row2 + cdef REAL_t f, g, count, inv_count, sgn + cdef int m + + memset(neu1, 0, size * cython.sizeof(REAL_t)) + count = 0.0 + for m in range(j, k): + if m == i or codelens[m] == 0: + continue + else: + count += ONEF + our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + if count > (0.5): + inv_count = ONEF/count + if cbow_mean: + 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) + sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + f = sgn*f + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + work[0] += f + + +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/syntax_model_files/gensim/models/word2vec_synt.py b/syntax_model_files/gensim/models/word2vec_synt.py new file mode 100644 index 0000000000..004ef57708 --- /dev/null +++ b/syntax_model_files/gensim/models/word2vec_synt.py @@ -0,0 +1,1667 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + + +""" +Deep learning via word2vec's "skip-gram and CBOW models", using either +hierarchical softmax or negative sampling [1]_ [2]_. + +The training algorithms were originally ported from the C package https://code.google.com/p/word2vec/ +and extended with additional functionality. + +For a blog tutorial on gensim word2vec, with an interactive web app trained on GoogleNews, visit http://radimrehurek.com/2014/02/word2vec-tutorial/ + +**Make sure you have a C compiler before installing gensim, to use optimized (compiled) word2vec training** +(70x speedup compared to plain NumPy implementation [3]_). + +Initialize a model with e.g.:: + +>>> model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4) + +Persist a model to disk with:: + +>>> model.save(fname) +>>> model = Word2Vec.load(fname) # you can continue training with the loaded model! + +The model can also be instantiated from an existing file on disk in the word2vec C format:: + + >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False) # C text format + >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.bin', binary=True) # C binary format + +You can perform various syntactic/semantic NLP word tasks with the model. Some of them +are already built-in:: + + >>> model.most_similar(positive=['woman', 'king'], negative=['man']) + [('queen', 0.50882536), ...] + + >>> model.doesnt_match("breakfast cereal dinner lunch".split()) + 'cereal' + + >>> model.similarity('woman', 'man') + 0.73723527 + + >>> model['computer'] # raw numpy vector of a word + array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32) + +and so on. + +If you're finished training a model (=no more updates, only querying), you can do + + >>> model.init_sims(replace=True) + +to trim unneeded model memory = use (much) less RAM. + +Note that there is a :mod:`gensim.models.phrases` module which lets you automatically +detect phrases longer than one word. Using phrases, you can learn a word2vec model +where "words" are actually multiword expressions, such as `new_york_times` or `financial_crisis`: + +>>> bigram_transformer = gensim.models.Phrases(sentences) +>>> model = Word2Vec(bigram_transformer[sentences], size=100, ...) + +.. [1] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013. +.. [2] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their Compositionality. + In Proceedings of NIPS, 2013. +.. [3] Optimizing word2vec in gensim, http://radimrehurek.com/2013/09/word2vec-in-python-part-two-optimizing/ +""" +from __future__ import division # py3 "true division" + +import logging +import sys +import os +import heapq +from timeit import default_timer +from copy import deepcopy +from collections import defaultdict +import threading +import itertools + +from gensim.utils import keep_vocab_item + +try: + from queue import Queue, Empty +except ImportError: + from Queue import Queue, Empty + +from numpy import exp, log, dot, zeros, outer, random, dtype, float32 as REAL,\ + uint32, seterr, array, uint8, vstack, fromstring, sqrt, newaxis,\ + ndarray, empty, sum as np_sum, prod, ones, ascontiguousarray + +from gensim import utils, matutils # utility fnc for pickling, common scipy operations etc +from six import iteritems, itervalues, string_types +from six.moves import xrange +from types import GeneratorType + +logger = logging.getLogger(__name__) + +try: + from gensim.models.word2vec_inner_synt2 import train_batch_sg, train_batch_cbow + from gensim.models.word2vec_inner_synt2 import score_sentence_sg, score_sentence_cbow + from gensim.models.word2vec_inner_synt2 import FAST_VERSION, MAX_WORDS_IN_BATCH +except ImportError: + # failed... fall back to plain numpy (20-80x slower training than the above) + FAST_VERSION = -1 + MAX_WORDS_IN_BATCH = 10000 + + def train_batch_sg(model, sentences, alpha, work=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 `Word2Vec.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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) + for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): + # don't train on the `word` itself + if pos2 != pos: + train_sg_pair(model, model.index2word[word.index], word2.index, alpha) + result += len(word_vocabs) + return result + + 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 `Word2Vec.train()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + result = 0 + for sentence in sentences: + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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 + start = max(0, pos - model.window + reduced_window) # choose starting word position + window_pos = enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start) # create a window + word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + train_cbow_pair(model, word, word2_indices, l1, alpha) + result += len(word_vocabs) + return result + + def score_sentence_sg(model, sentence, work=None): + """ + Obtain likelihood score for a single sentence in a fitted skip-gram representaion. + + The sentence is a list of Vocab objects (or None, when the corresponding + word is not in the vocabulary). Called internally from `Word2Vec.score()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + + log_prob_sentence = 0.0 + if model.negative: + raise RuntimeError("scoring is only available for HS=True") + + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + for pos, word in enumerate(word_vocabs): + if word is None: + continue # OOV word in the input sentence => skip + + # now go over all words from the window, predicting each one in turn + start = max(0, pos - model.window) + for pos2, word2 in enumerate(word_vocabs[start : pos + model.window + 1], start): + # don't train on OOV words and on the `word` itself + if word2 is not None and pos2 != pos: + log_prob_sentence += score_sg_pair(model, word, word2) + + return log_prob_sentence + + def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): + """ + Obtain likelihood score for a single sentence in a fitted CBOW representaion. + + The sentence is a list of Vocab objects (or None, where the corresponding + word is not in the vocabulary. Called internally from `Word2Vec.score()`. + + This is the non-optimized, Python version. If you have cython installed, gensim + will use the optimized version from word2vec_inner instead. + + """ + log_prob_sentence = 0.0 + if model.negative: + raise RuntimeError("scoring is only available for HS=True") + + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + for pos, word in enumerate(word_vocabs): + if word is None: + continue # OOV word in the input sentence => skip + + start = max(0, pos - model.window) + window_pos = enumerate(word_vocabs[start:(pos + model.window + 1)], start) + word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x layer1_size + if word2_indices and model.cbow_mean: + l1 /= len(word2_indices) + log_prob_sentence += score_cbow_pair(model, word, word2_indices, l1) + + return log_prob_sentence + + +def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_hidden=True, + context_vectors=None, context_locks=None): + if context_vectors is None: + context_vectors = model.syn0 + if context_locks is None: + context_locks = model.syn0_lockf + + if word not in model.vocab: + return + predict_word = model.vocab[word] # target word (NN output) + + l1 = context_vectors[context_index] # input word (NN input/projection layer) + lock_factor = context_locks[context_index] + + neu1e = zeros(l1.shape) + + if model.hs: + # work on the entire tree at once, to push as much work into numpy's C routines as possible (performance) + l2a = deepcopy(model.syn1[predict_word.point]) # 2d matrix, codelen x layer1_size + fa = 1.0 / (1.0 + exp(-dot(l1, l2a.T))) # propagate hidden -> output + ga = (1 - predict_word.code - fa) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1[predict_word.point] += outer(ga, l1) # learn hidden -> output + neu1e += dot(ga, l2a) # save error + + if model.negative: + # use this word (label = 1) + `negative` other random words not from this sentence (label = 0) + word_indices = [predict_word.index] + while len(word_indices) < model.negative + 1: + w = model.cum_table.searchsorted(model.random.randint(model.cum_table[-1])) + if w != predict_word.index: + word_indices.append(w) + l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size + fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output + gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output + neu1e += dot(gb, l2b) # save error + + if learn_vectors: + l1 += neu1e * lock_factor # learn input -> hidden (mutates model.syn0[word2.index], if that is l1) + return neu1e + + +def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=True, learn_hidden=True): + neu1e = zeros(l1.shape) + + if model.hs: + l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size + fa = 1. / (1. + exp(-dot(l1, l2a.T))) # propagate hidden -> output + ga = (1. - word.code - fa) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1[word.point] += outer(ga, l1) # learn hidden -> output + neu1e += dot(ga, l2a) # save error + + if model.negative: + # use this word (label = 1) + `negative` other random words not from this sentence (label = 0) + word_indices = [word.index] + while len(word_indices) < model.negative + 1: + w = model.cum_table.searchsorted(model.random.randint(model.cum_table[-1])) + if w != word.index: + word_indices.append(w) + l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size + fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output + gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate + if learn_hidden: + model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output + neu1e += dot(gb, l2b) # save error + + if learn_vectors: + # learn input -> hidden, here for all words in the window separately + if not model.cbow_mean and input_word_indices: + neu1e /= len(input_word_indices) + for i in input_word_indices: + model.syn0[i] += neu1e * model.syn0_lockf[i] + + return neu1e + + +def score_sg_pair(model, word, word2): + l1 = model.syn0[word2.index] + l2a = deepcopy(model.syn1[word.point]) # 2d matrix, codelen x layer1_size + sgn = -1.0**word.code # ch function, 0-> 1, 1 -> -1 + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + return sum(lprob) + + +def score_cbow_pair(model, word, word2_indices, l1): + l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size + sgn = -1.0**word.code # ch function, 0-> 1, 1 -> -1 + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + return sum(lprob) + + +class Vocab(object): + """ + A single vocabulary item, used internally for collecting per-word frequency/sampling info, + and for constructing binary trees (incl. both word leaves and inner nodes). + + """ + def __init__(self, **kwargs): + self.count = 0 + self.__dict__.update(kwargs) + + def __lt__(self, other): # used for sorting in a priority queue + return self.count < other.count + + def __str__(self): + vals = ['%s:%r' % (key, self.__dict__[key]) for key in sorted(self.__dict__) if not key.startswith('_')] + return "%s(%s)" % (self.__class__.__name__, ', '.join(vals)) + + +class Word2Vec(utils.SaveLoad): + """ + Class for training, using and evaluating neural networks described in https://code.google.com/p/ + / + + The model can be stored/loaded via its `save()` and `load()` methods, or stored/loaded in a format + compatible with the original word2vec implementation via `save_word2vec_format()` and `load_word2vec_format()`. + + """ + def __init__( + self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, + max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, + sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, + trim_rule=None, sorted_vocab=1, 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. + + The `sentences` iterable can be simply a list, but for larger corpora, + consider an iterable that streams the sentences directly from disk/network. + See :class:`BrownCorpus`, :class:`Text8Corpus` or :class:`LineSentence` in + this 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` defines the training algorithm. By default (`sg=0`), CBOW is used. + Otherwise (`sg=1`), skip-gram is employed. + + `size` is the dimensionality of the feature vectors. + + `window` is the maximum distance between the current and predicted word within a sentence. + + `alpha` is the initial learning rate (will linearly drop to zero as training progresses). + + `seed` = for the random number generator. Initial vectors for each + word are seeded with a hash of the concatenation of word + str(seed). + + `min_count` = ignore all words with total frequency lower than this. + + `max_vocab_size` = limit 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 (default). + + `sample` = threshold for configuring which higher-frequency words are randomly downsampled; + default is 1e-3, useful range is (0, 1e-5). + + `workers` = use this many worker threads to train the model (=faster training with multicore machines). + + `hs` = if 1, hierarchical softmax will be used for model training. + If set to 0 (default), and `negative` is non-zero, negative sampling will be used. + + `negative` = if > 0, negative sampling will be used, the int for negative + specifies how many "noise words" should be drawn (usually between 5-20). + Default is 5. If set to 0, no negative samping is used. + + `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. + Only applies when cbow is used. + + `hashfxn` = hash function to use to randomly initialize weights, for increased + training reproducibility. Default is Python's rudimentary built in hash function. + + `iter` = number of iterations (epochs) over the corpus. + + `trim_rule` = 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), or a callable that accepts parameters (word, count, min_count) and + returns either util.RULE_DISCARD, util.RULE_KEEP or util.RULE_DEFAULT. + Note: The rule, if given, is only used prune vocabulary during build_vocab() and is not stored as part + of the model. + + `sorted_vocab` = if 1 (default), sort the vocabulary by descending frequency before + assigning word indexes. + + `batch_words` = target size (in words) for batches of examples passed to worker threads (and + thus cython routines). Default is 10000. (Larger batches can be passed if individual + texts are longer, but the cython code may truncate.) + + """ + self.vocab = {} # mapping from a word (string) to a Vocab object + self.index2word = [] # map from a word's matrix index (int) to word (string) + self.sg = int(sg) + self.cum_table = None # for negative sampling + self.vector_size = int(size) + self.layer1_size = int(size) + if size % 4 != 0: + logger.warning("consider setting layer size to a multiple of 4 for greater performance") + self.alpha = float(alpha) + self.window = int(window) + self.max_vocab_size = max_vocab_size + self.seed = seed + self.random = random.RandomState(seed) + self.min_count = min_count + self.sample = sample + self.workers = int(workers) + self.min_alpha = float(min_alpha) + self.hs = hs + self.negative = negative + self.cbow_mean = int(cbow_mean) + self.hashfxn = hashfxn + self.iter = iter + self.null_word = null_word + self.train_count = 0 + self.total_train_time = 0 + self.sorted_vocab = sorted_vocab + self.batch_words = batch_words + + if sentences is not None: + if isinstance(sentences, GeneratorType): + raise TypeError("You can't pass a generator as the sentences argument. Try an iterator.") + self.build_vocab(sentences, trim_rule=trim_rule) + self.train(sentences) + + def make_cum_table(self, power=0.75, domain=2**31 - 1): + """ + Create a cumulative-distribution table using stored vocabulary word counts for + drawing random words in the negative-sampling training routines. + + To draw a word index, choose a random integer up to the maximum value in the + table (cum_table[-1]), then finding that integer's sorted insertion point + (as if by bisect_left or ndarray.searchsorted()). That insertion point is the + drawn index, coming up in proportion equal to the increment at that slot. + + Called internally from 'build_vocab()'. + """ + vocab_size = len(self.index2word) + self.cum_table = zeros(vocab_size, dtype=uint32) + # compute sum of all power (Z in paper) + train_words_pow = float(sum([self.vocab[word].count**power for word in self.vocab])) + cumulative = 0.0 + for word_index in range(vocab_size): + cumulative += self.vocab[self.index2word[word_index]].count**power / train_words_pow + self.cum_table[word_index] = round(cumulative * domain) + if len(self.cum_table) > 0: + assert self.cum_table[-1] == domain + + def create_binary_tree(self): + """ + Create a binary Huffman tree using stored vocabulary word counts. Frequent words + will have shorter binary codes. Called internally from `build_vocab()`. + + """ + logger.info("constructing a huffman tree from %i words", len(self.vocab)) + + # build the huffman tree + heap = list(itervalues(self.vocab)) + heapq.heapify(heap) + for i in xrange(len(self.vocab) - 1): + min1, min2 = heapq.heappop(heap), heapq.heappop(heap) + heapq.heappush(heap, Vocab(count=min1.count + min2.count, index=i + len(self.vocab), left=min1, right=min2)) + + # recurse over the tree, assigning a binary code to each vocabulary word + if heap: + max_depth, stack = 0, [(heap[0], [], [])] + while stack: + node, codes, points = stack.pop() + if node.index < len(self.vocab): + # leaf node => store its path from the root + node.code, node.point = codes, points + max_depth = max(len(codes), max_depth) + else: + # inner node => continue recursion + points = array(list(points) + [node.index - len(self.vocab)], dtype=uint32) + stack.append((node.left, array(list(codes) + [0], dtype=uint8), points)) + stack.append((node.right, array(list(codes) + [1], dtype=uint8), points)) + + logger.info("built huffman tree with maximum node depth %i", max_depth) + + def build_vocab(self, sentences, keep_raw_vocab=False, trim_rule=None): + """ + Build vocabulary from a sequence of sentences (can be a once-only generator stream). + Each sentence must be a list of unicode strings. + + """ + self.scan_vocab(sentences, trim_rule=trim_rule) # initial survey + self.scale_vocab(keep_raw_vocab=keep_raw_vocab, trim_rule=trim_rule) # trim by min_count & precalculate downsampling + self.finalize_vocab() # build tables & arrays + + def scan_vocab(self, sentences, progress_per=10000, trim_rule=None): + """Do an initial scan of all words appearing in sentences.""" + logger.info("collecting all words and their counts") + sentence_no = -1 + total_words = 0 + min_reduce = 1 + vocab = defaultdict(int) + for sentence_no, sentence in enumerate(sentences): + if sentence_no % progress_per == 0: + logger.info("PROGRESS: at sentence #%i, processed %i words, keeping %i word types", + sentence_no, sum(itervalues(vocab)) + total_words, len(vocab)) + for word in sentence: + vocab[word] += 1 + + if self.max_vocab_size and len(vocab) > self.max_vocab_size: + total_words += utils.prune_vocab(vocab, min_reduce, trim_rule=trim_rule) + min_reduce += 1 + + total_words += sum(itervalues(vocab)) + logger.info("collected %i word types from a corpus of %i raw words and %i sentences", + len(vocab), total_words, sentence_no + 1) + self.corpus_count = sentence_no + 1 + self.raw_vocab = vocab + + def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab=False, trim_rule=None): + """ + Apply vocabulary settings for `min_count` (discarding less-frequent words) + and `sample` (controlling the downsampling of more-frequent words). + + Calling with `dry_run=True` will only simulate the provided settings and + report the size of the retained vocabulary, effective corpus length, and + estimated memory requirements. Results are both printed via logging and + returned as a dict. + + Delete the raw vocabulary after the scaling is done to free up RAM, + unless `keep_raw_vocab` is set. + + """ + min_count = min_count or self.min_count + sample = sample or self.sample + + # Discard words less-frequent than min_count + if not dry_run: + self.index2word = [] + # make stored settings match these applied settings + self.min_count = min_count + self.sample = sample + self.vocab = {} + drop_unique, drop_total, retain_total, original_total = 0, 0, 0, 0 + retain_words = [] + for word, v in iteritems(self.raw_vocab): + if keep_vocab_item(word, v, min_count, trim_rule=trim_rule): + retain_words.append(word) + retain_total += v + original_total += v + if not dry_run: + self.vocab[word] = Vocab(count=v, index=len(self.index2word)) + self.index2word.append(word) + else: + drop_unique += 1 + drop_total += v + original_total += v + logger.info("min_count=%d retains %i unique words (drops %i)", + min_count, len(retain_words), drop_unique) + logger.info("min_count leaves %i word corpus (%i%% of original %i)", + retain_total, retain_total * 100 / max(original_total, 1), original_total) + + # Precalculate each vocabulary item's threshold for sampling + if not sample: + # no words downsampled + threshold_count = retain_total + elif sample < 1.0: + # traditional meaning: set parameter as proportion of total + threshold_count = sample * retain_total + else: + # new shorthand: sample >= 1 means downsample all words with higher count than sample + threshold_count = int(sample * (3 + sqrt(5)) / 2) + + downsample_total, downsample_unique = 0, 0 + for w in retain_words: + v = self.raw_vocab[w] + word_probability = (sqrt(v / threshold_count) + 1) * (threshold_count / v) + if word_probability < 1.0: + downsample_unique += 1 + downsample_total += word_probability * v + else: + word_probability = 1.0 + downsample_total += v + if not dry_run: + self.vocab[w].sample_int = int(round(word_probability * 2**32)) + + if not dry_run and not keep_raw_vocab: + logger.info("deleting the raw counts dictionary of %i items", len(self.raw_vocab)) + self.raw_vocab = defaultdict(int) + + logger.info("sample=%g downsamples %i most-common words", sample, downsample_unique) + logger.info("downsampling leaves estimated %i word corpus (%.1f%% of prior %i)", + downsample_total, downsample_total * 100.0 / max(retain_total, 1), retain_total) + + # return from each step: words-affected, resulting-corpus-size + report_values = {'drop_unique': drop_unique, 'retain_total': retain_total, + 'downsample_unique': downsample_unique, 'downsample_total': int(downsample_total)} + + # print extra memory estimates + report_values['memory'] = self.estimate_memory(vocab_size=len(retain_words)) + + return report_values + + def finalize_vocab(self): + """Build tables and model weights based on final vocabulary settings.""" + if not self.index2word: + self.scale_vocab() + if self.sorted_vocab: + self.sort_vocab() + if self.hs: + # add info about each word's Huffman encoding + self.create_binary_tree() + if self.negative: + # build the table for drawing random words (for negative sampling) + self.make_cum_table() + if self.null_word: + # create null pseudo-word for padding when using concatenative L1 (run-of-words) + # this word is only ever input – never predicted – so count, huffman-point, etc doesn't matter + word, v = '\0', Vocab(count=1, sample_int=0) + v.index = len(self.vocab) + self.index2word.append(word) + self.vocab[word] = v + # set initial input/projection and hidden weights + self.reset_weights() + + def sort_vocab(self): + """Sort the vocabulary so the most frequent words have the lowest indexes.""" + if hasattr(self, 'syn0'): + raise RuntimeError("must sort before initializing vectors/weights") + self.index2word.sort(key=lambda word: self.vocab[word].count, reverse=True) + for i, word in enumerate(self.index2word): + self.vocab[word].index = i + + def reset_from(self, other_model): + """ + Borrow shareable pre-built structures (like vocab) from the other_model. Useful + if testing multiple models in parallel on the same corpus. + """ + self.vocab = other_model.vocab + self.index2word = other_model.index2word + self.cum_table = other_model.cum_table + self.corpus_count = other_model.corpus_count + self.reset_weights() + + 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)`. + """ + work, neu1 = inits + tally = 0 + if self.sg: + tally += train_batch_sg(self, sentences, alpha, work) + else: + tally += train_batch_cbow(self, sentences, alpha, work, neu1) + return tally, self._raw_word_count(sentences) + + def _raw_word_count(self, job): + """Return the number of words in a given job.""" + return sum(len(sentence) for sentence in job) + + def train(self, sentences, total_words=None, word_count=0, + total_examples=None, 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 Word2Vec, 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, either total_examples + (count of sentences) or total_words (count of raw words in sentences) should be provided, unless the + sentences are the same as those that were used to initially build the vocabulary. + + """ + if FAST_VERSION < 0: + import warnings + warnings.warn("C extension not loaded for Word2Vec, training will be slow. " + "Install a C compiler and reinstall gensim for fast training.") + 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. + + logger.info( + "training model with %i workers on %i vocabulary and %i features, " + "using sg=%s hs=%s sample=%s negative=%s", + self.workers, len(self.vocab), self.layer1_size, self.sg, + self.hs, self.sample, self.negative) + + if not self.vocab: + raise RuntimeError("you must first build vocabulary before training the model") + if not hasattr(self, 'syn0'): + raise RuntimeError("you must first finalize vocabulary before training the model") + + if total_words is None and total_examples is None: + if self.corpus_count: + total_examples = self.corpus_count + logger.info("expecting %i sentences, matching count from corpus used for vocabulary survey", total_examples) + else: + raise ValueError("you must provide either total_words or total_examples, to enable alpha and progress calculations") + + job_tally = 0 + + if self.iter > 1: + sentences = utils.RepeatCorpusNTimes(sentences, self.iter) + total_words = total_words and total_words * self.iter + total_examples = total_examples and total_examples * self.iter + + def worker_loop(): + """Train the model, lifting lists of sentences from the job_queue.""" + work = matutils.zeros_aligned(self.layer1_size, dtype=REAL) # per-thread private work memory + neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) + jobs_processed = 0 + while True: + job = job_queue.get() + if job is None: + progress_queue.put(None) + break # no more jobs => quit this worker + sentences, alpha = job + tally, raw_tally = self._do_train_job(sentences, alpha, (work, neu1)) + progress_queue.put((len(sentences), tally, raw_tally)) # report back progress + jobs_processed += 1 + logger.debug("worker exiting, processed %i jobs", jobs_processed) + + def job_producer(): + """Fill jobs queue using the input `sentences` iterator.""" + job_batch, batch_size = [], 0 + pushed_words, pushed_examples = 0, 0 + next_alpha = self.alpha + job_no = 0 + + for sent_idx, sentence in enumerate(sentences): + sentence_length = self._raw_word_count([sentence]) + + # can we fit this sentence into the existing job batch? + if batch_size + sentence_length <= self.batch_words: + # yes => add it to the current job + job_batch.append(sentence) + batch_size += sentence_length + else: + # no => submit the existing job + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 + job_queue.put((job_batch, next_alpha)) + + # update the learning rate for the next job + if self.min_alpha < next_alpha: + if total_examples: + # examples-based decay + pushed_examples += len(job_batch) + progress = 1.0 * pushed_examples / total_examples + else: + # words-based decay + pushed_words += self._raw_word_count(job_batch) + progress = 1.0 * pushed_words / total_words + next_alpha = self.alpha - (self.alpha - self.min_alpha) * progress + next_alpha = max(self.min_alpha, next_alpha) + + # add the sentence that didn't fit as the first item of a new job + job_batch, batch_size = [sentence], sentence_length + + # add the last job too (may be significantly smaller than batch_words) + if job_batch: + logger.debug( + "queueing job #%i (%i words, %i sentences) at alpha %.05f", + job_no, batch_size, len(job_batch), next_alpha) + job_no += 1 + job_queue.put((job_batch, next_alpha)) + + if job_no == 0 and self.train_count == 0: + logger.warning( + "train() called with an empty iterator (if not intended, " + "be sure to provide a corpus that offers restartable " + "iteration = an iterable)." + ) + + # give the workers heads up that they can finish -- no more work! + for _ in xrange(self.workers): + job_queue.put(None) + logger.debug("job loop exiting, total %i jobs", job_no) + + # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( + job_queue = Queue(maxsize=queue_factor * self.workers) + progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) + + workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + unfinished_worker_count = len(workers) + workers.append(threading.Thread(target=job_producer)) + + for thread in workers: + thread.daemon = True # make interrupting the process with ctrl+c easier + thread.start() + + example_count, trained_word_count, raw_word_count = 0, 0, word_count + start, next_report = default_timer() - 0.00001, 1.0 + + while unfinished_worker_count > 0: + report = progress_queue.get() # blocks if workers too slow + if report is None: # a thread reporting that it finished + unfinished_worker_count -= 1 + logger.info("worker thread finished; awaiting finish of %i more threads", unfinished_worker_count) + continue + examples, trained_words, raw_words = report + job_tally += 1 + + # update progress stats + example_count += examples + trained_word_count += trained_words # only words in vocab & sampled + raw_word_count += raw_words + + # log progress once every report_delay seconds + elapsed = default_timer() - start + if elapsed >= next_report: + if total_examples: + # examples-based progress % + logger.info( + "PROGRESS: at %.2f%% examples, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * example_count / total_examples, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + else: + # words-based progress % + logger.info( + "PROGRESS: at %.2f%% words, %.0f words/s, in_qsize %i, out_qsize %i", + 100.0 * raw_word_count / total_words, trained_word_count / elapsed, + utils.qsize(job_queue), utils.qsize(progress_queue)) + next_report = elapsed + report_delay + + # all done; report the final stats + elapsed = default_timer() - start + logger.info( + "training on %i raw words (%i effective words) took %.1fs, %.0f effective words/s", + raw_word_count, trained_word_count, elapsed, trained_word_count / elapsed) + if job_tally < 10 * self.workers: + logger.warn("under 10 jobs per worker: consider setting a smaller `batch_words' for smoother alpha decay") + + # check that the input corpus hasn't changed during iteration + if total_examples and total_examples != example_count: + logger.warn("supplied example count (%i) did not equal expected count (%i)", example_count, total_examples) + if total_words and total_words != raw_word_count: + logger.warn("supplied raw word count (%i) did not equal expected count (%i)", raw_word_count, total_words) + + self.train_count += 1 # number of times train() has been called + self.total_train_time += elapsed + self.clear_sims() + return trained_word_count + + # basics copied from the train() function + def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor=2, report_delay=1): + """ + Score the log probability for a sequence of sentences (can be a once-only generator stream). + Each sentence must be a list of unicode strings. + This does not change the fitted model in any way (see Word2Vec.train() for that) + + Note that you should specify total_sentences; we'll run into problems if you ask to + score more than this number of sentences but it is inefficient to set the value too high. + + See the article by [taddy]_ and the gensim demo at [deepir]_ for examples of how to use such scores in document classification. + + .. [taddy] Taddy, Matt. Document Classification by Inversion of Distributed Language Representations, in Proceedings of the 2015 Conference of the Association of Computational Linguistics. + .. [deepir] https://github.com/TaddyLab/gensim/blob/deepir/docs/notebooks/deepir.ipynb + + """ + if FAST_VERSION < 0: + import warnings + warnings.warn("C extension compilation failed, scoring will be slow. " + "Install a C compiler and reinstall gensim for fastness.") + + logger.info( + "scoring sentences with %i workers on %i vocabulary and %i features, " + "using sg=%s hs=%s sample=%s and negative=%s", + self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) + + if not self.vocab: + raise RuntimeError("you must first build vocabulary before scoring new data") + + if not self.hs: + raise RuntimeError("we have only implemented score for hs") + + def worker_loop(): + """Train the model, lifting lists of sentences from the jobs queue.""" + work = zeros(1, dtype=REAL) # for sg hs, we actually only need one memory loc (running sum) + neu1 = matutils.zeros_aligned(self.layer1_size, dtype=REAL) + while True: + job = job_queue.get() + if job is None: # signal to finish + break + ns = 0 + for sentence_id, sentence in job: + if sentence_id >= total_sentences: + break + if self.sg: + score = score_sentence_sg(self, sentence, work) + else: + score = score_sentence_cbow(self, sentence, work, neu1) + sentence_scores[sentence_id] = score + ns += 1 + progress_queue.put(ns) # report progress + + start, next_report = default_timer(), 1.0 + # buffer ahead only a limited number of jobs.. this is the reason we can't simply use ThreadPool :( + job_queue = Queue(maxsize=queue_factor * self.workers) + progress_queue = Queue(maxsize=(queue_factor + 1) * self.workers) + + workers = [threading.Thread(target=worker_loop) for _ in xrange(self.workers)] + for thread in workers: + thread.daemon = True # make interrupting the process with ctrl+c easier + thread.start() + + sentence_count = 0 + sentence_scores = matutils.zeros_aligned(total_sentences, dtype=REAL) + + push_done = False + done_jobs = 0 + jobs_source = enumerate(utils.grouper(enumerate(sentences), chunksize)) + + # fill jobs queue with (id, sentence) job items + while True: + try: + job_no, items = next(jobs_source) + if (job_no - 1) * chunksize > total_sentences: + logger.warning( + "terminating after %i sentences (set higher total_sentences if you want more).", + total_sentences) + job_no -= 1 + raise StopIteration() + logger.debug("putting job #%i in the queue", job_no) + job_queue.put(items) + except StopIteration: + logger.info( + "reached end of input; waiting to finish %i outstanding jobs", + job_no - done_jobs + 1) + for _ in xrange(self.workers): + job_queue.put(None) # give the workers heads up that they can finish -- no more work! + push_done = True + try: + while done_jobs < (job_no + 1) or not push_done: + ns = progress_queue.get(push_done) # only block after all jobs pushed + sentence_count += ns + done_jobs += 1 + elapsed = default_timer() - start + if elapsed >= next_report: + logger.info( + "PROGRESS: at %.2f%% sentences, %.0f sentences/s", + 100.0 * sentence_count, sentence_count / elapsed) + next_report = elapsed + report_delay # don't flood log, wait report_delay seconds + else: + # loop ended by job count; really done + break + except Empty: + pass # already out of loop; continue to next push + + elapsed = default_timer() - start + self.clear_sims() + logger.info( + "scoring %i sentences took %.1fs, %.0f sentences/s", + sentence_count, elapsed, sentence_count / elapsed) + return sentence_scores[:sentence_count] + + def clear_sims(self): + self.syn0norm = None + + def reset_weights(self): + """Reset all projection weights to an initial (untrained) state, but keep the existing vocabulary.""" + logger.info("resetting layer weights") + self.syn0 = empty((len(self.vocab), self.vector_size), dtype=REAL) + # randomize weights vector by vector, rather than materializing a huge random matrix in RAM at once + for i in xrange(len(self.vocab)): + # construct deterministic seed from word AND seed argument + self.syn0[i] = self.seeded_vector(str(self.index2word[i]) + str(self.seed)) + if self.hs: + self.syn1 = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + if self.negative: + self.syn1neg = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + self.syn0norm = None + + self.syn0_lockf = ones(len(self.vocab), dtype=REAL) # zeros suppress learning + + def seeded_vector(self, seed_string): + """Create one 'random' vector (but deterministic by seed_string)""" + # Note: built-in hash() may vary by Python version or even (in Py3.x) per launch + once = random.RandomState(self.hashfxn(seed_string) & 0xffffffff) + return (once.rand(self.vector_size) - 0.5) / self.vector_size + + def save_word2vec_format(self, fname, fvocab=None, binary=False): + """ + Store the input-hidden weight matrix in the same format used by the original + C word2vec-tool, for compatibility. + + """ + if fvocab is not None: + logger.info("storing vocabulary in %s" % (fvocab)) + with utils.smart_open(fvocab, 'wb') as vout: + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + vout.write(utils.to_utf8("%s %s\n" % (word, vocab.count))) + logger.info("storing %sx%s projection weights into %s" % (len(self.vocab), self.vector_size, fname)) + assert (len(self.vocab), self.vector_size) == self.syn0.shape + with utils.smart_open(fname, 'wb') as fout: + fout.write(utils.to_utf8("%s %s\n" % self.syn0.shape)) + # store in sorted order: most frequent words at the top + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + row = self.syn0[vocab.index] + if binary: + fout.write(utils.to_utf8(word) + b" " + row.tostring()) + else: + fout.write(utils.to_utf8("%s %s\n" % (word, ' '.join("%f" % val for val in row)))) + + @classmethod + def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', unicode_errors='strict'): + """ + Load the input-hidden weight matrix from the original C word2vec-tool format. + + Note that the information stored in the file is incomplete (the binary tree is missing), + so while you can query for word similarity etc., you cannot continue training + with a model loaded this way. + + `binary` is a boolean indicating whether the data is in binary word2vec format. + `norm_only` is a boolean indicating whether to only store normalised word2vec vectors in memory. + Word counts are read from `fvocab` filename, if set (this is the file generated + by `-save-vocab` flag of the original C tool). + + If you trained the C model using non-utf8 encoding for words, specify that + encoding in `encoding`. + + """ + counts = None + if fvocab is not None: + logger.info("loading word counts from %s", fvocab) + counts = {} + with utils.smart_open(fvocab) as fin: + for line in fin: + word, count = utils.to_unicode(line).strip().split() + counts[word] = int(count) + + logger.info("loading projection weights from %s", fname) + with utils.smart_open(fname) as fin: + header = utils.to_unicode(fin.readline(), encoding=encoding) + vocab_size, vector_size = map(int, header.split()) # throws for invalid file format + result = cls(size=vector_size) + result.syn0 = zeros((vocab_size, vector_size), dtype=REAL) + + def add_word(word, weights): + word_id = len(result.vocab) + if word in result.vocab: + logger.warning("duplicate word '%s' in %s, ignoring all but first", word, fname) + return + if counts is None: + # most common scenario: no vocab file given. just make up some bogus counts, in descending order + result.vocab[word] = Vocab(index=word_id, count=vocab_size - word_id) + elif word in counts: + # use count from the vocab file + result.vocab[word] = Vocab(index=word_id, count=counts[word]) + else: + # vocab file given, but word is missing -- set count to None (TODO: or raise?) + logger.warning("vocabulary file is incomplete: '%s' is missing", word) + result.vocab[word] = Vocab(index=word_id, count=None) + result.syn0[word_id] = weights + result.index2word.append(word) + + if binary: + binary_len = dtype(REAL).itemsize * vector_size + for line_no in xrange(vocab_size): + # mixed text and binary: read text first, then binary + word = [] + while True: + ch = fin.read(1) + if ch == b' ': + break + if ch != b'\n': # ignore newlines in front of words (some binary files have) + word.append(ch) + word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) + weights = fromstring(fin.read(binary_len), dtype=REAL) + add_word(word, weights) + else: + for line_no, line in enumerate(fin): + parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") + if len(parts) != vector_size + 1: + raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) + word, weights = parts[0], list(map(REAL, parts[1:])) + add_word(word, weights) + if result.syn0.shape[0] != len(result.vocab): + logger.info( + "duplicate words detected, shrinking matrix size from %i to %i", + result.syn0.shape[0], len(result.vocab) + ) + result.syn0 = ascontiguousarray(result.syn0[: len(result.vocab)]) + assert (len(result.vocab), result.vector_size) == result.syn0.shape + + logger.info("loaded %s matrix from %s" % (result.syn0.shape, fname)) + return result + + def intersect_word2vec_format(self, fname, binary=False, encoding='utf8', unicode_errors='strict'): + """ + Merge the input-hidden weight matrix from the original C word2vec-tool format + given, where it intersects with the current vocabulary. (No words are added to the + existing vocabulary, but intersecting words adopt the file's weights, and + non-intersecting words are left alone.) + + `binary` is a boolean indicating whether the data is in binary word2vec format. + """ + overlap_count = 0 + logger.info("loading projection weights from %s" % (fname)) + with utils.smart_open(fname) as fin: + header = utils.to_unicode(fin.readline(), encoding=encoding) + vocab_size, vector_size = map(int, header.split()) # throws for invalid file format + if not vector_size == self.vector_size: + raise ValueError("incompatible vector size %d in file %s" % (vector_size, fname)) + # TOCONSIDER: maybe mismatched vectors still useful enough to merge (truncating/padding)? + if binary: + binary_len = dtype(REAL).itemsize * vector_size + for line_no in xrange(vocab_size): + # mixed text and binary: read text first, then binary + word = [] + while True: + ch = fin.read(1) + if ch == b' ': + break + if ch != b'\n': # ignore newlines in front of words (some binary files have) + word.append(ch) + word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) + weights = fromstring(fin.read(binary_len), dtype=REAL) + if word in self.vocab: + overlap_count += 1 + self.syn0[self.vocab[word].index] = weights + self.syn0_lockf[self.vocab[word].index] = 0.0 # lock it + else: + for line_no, line in enumerate(fin): + parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") + if len(parts) != vector_size + 1: + raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) + word, weights = parts[0], list(map(REAL, parts[1:])) + if word in self.vocab: + overlap_count += 1 + self.syn0[self.vocab[word].index] = weights + logger.info("merged %d vectors into %s matrix from %s" % (overlap_count, self.syn0.shape, fname)) + + def most_similar(self, positive=[], negative=[], topn=10, restrict_vocab=None): + """ + Find the top-N most similar words. Positive words contribute positively towards the + similarity, negative words negatively. + + This method computes cosine similarity between a simple mean of the projection + weight vectors of the given words and the vectors for each word in the model. + The method corresponds to the `word-analogy` and `distance` scripts in the original + word2vec implementation. + + If topn is False, most_similar 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.most_similar(positive=['woman', 'king'], negative=['man']) + [('queen', 0.50882536), ...] + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar('dog'), as a shorthand for most_similar(['dog']) + positive = [positive] + + # add weights for each word, if not already present; default to 1.0 for positive and -1.0 for negative words + positive = [ + (word, 1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in positive + ] + negative = [ + (word, -1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in negative + ] + + # compute the weighted average of all words + all_words, mean = set(), [] + for word, weight in positive + negative: + if isinstance(word, ndarray): + mean.append(weight * word) + elif word in self.vocab: + mean.append(weight * self.syn0norm[self.vocab[word].index]) + all_words.add(self.vocab[word].index) + else: + raise KeyError("word '%s' not in vocabulary" % word) + if not mean: + raise ValueError("cannot compute similarity with no input") + mean = matutils.unitvec(array(mean).mean(axis=0)).astype(REAL) + + limited = self.syn0norm if restrict_vocab is None else self.syn0norm[:restrict_vocab] + dists = dot(limited, mean) + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] + return result[:topn] + + def most_similar_cosmul(self, positive=[], negative=[], topn=10): + """ + Find the top-N most similar words, using the multiplicative combination objective + proposed by Omer Levy and Yoav Goldberg in [4]_. Positive words still contribute + positively towards the similarity, negative words negatively, but with less + susceptibility to one large distance dominating the calculation. + + In the common analogy-solving case, of two positive and one negative examples, + this method is equivalent to the "3CosMul" objective (equation (4)) of Levy and Goldberg. + + Additional positive or negative examples contribute to the numerator or denominator, + respectively – a potentially sensible but untested extension of the method. (With + a single positive example, rankings will be the same as in the default most_similar.) + + Example:: + + >>> trained_model.most_similar_cosmul(positive=['baghdad', 'england'], negative=['london']) + [(u'iraq', 0.8488819003105164), ...] + + .. [4] Omer Levy and Yoav Goldberg. Linguistic Regularities in Sparse and Explicit Word Representations, 2014. + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar_cosmul('dog'), as a shorthand for most_similar_cosmul(['dog']) + positive = [positive] + + all_words = set() + + def word_vec(word): + if isinstance(word, ndarray): + return word + elif word in self.vocab: + all_words.add(self.vocab[word].index) + return self.syn0norm[self.vocab[word].index] + else: + raise KeyError("word '%s' not in vocabulary" % word) + + positive = [word_vec(word) for word in positive] + negative = [word_vec(word) for word in negative] + if not positive: + raise ValueError("cannot compute similarity with no input") + + # equation (4) of Levy & Goldberg "Linguistic Regularities...", + # with distances shifted to [0,1] per footnote (7) + pos_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in positive] + neg_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in negative] + dists = prod(pos_dists, axis=0) / (prod(neg_dists, axis=0) + 0.000001) + + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] + return result[:topn] + + def doesnt_match(self, words): + """ + Which word from the given list doesn't go with the others? + + Example:: + + >>> trained_model.doesnt_match("breakfast cereal dinner lunch".split()) + 'cereal' + + """ + self.init_sims() + + words = [word for word in words if word in self.vocab] # filter out OOV words + logger.debug("using words %s" % words) + if not words: + raise ValueError("cannot select a word from an empty list") + vectors = vstack(self.syn0norm[self.vocab[word].index] for word in words).astype(REAL) + mean = matutils.unitvec(vectors.mean(axis=0)).astype(REAL) + dists = dot(vectors, mean) + return sorted(zip(dists, words))[0][1] + + 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.syn0[self.vocab[words].index] + + return vstack([self.syn0[self.vocab[word].index] for word in words]) + + def __contains__(self, word): + return word in self.vocab + + def similarity(self, w1, w2): + """ + Compute cosine similarity between two words. + + Example:: + + >>> trained_model.similarity('woman', 'man') + 0.73723527 + + >>> trained_model.similarity('woman', 'woman') + 1.0 + + """ + return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2])) + + def n_similarity(self, ws1, ws2): + """ + Compute cosine similarity between two sets of words. + + Example:: + + >>> trained_model.n_similarity(['sushi', 'shop'], ['japanese', 'restaurant']) + 0.61540466561049689 + + >>> trained_model.n_similarity(['restaurant', 'japanese'], ['japanese', 'restaurant']) + 1.0000000000000004 + + >>> trained_model.n_similarity(['sushi'], ['restaurant']) == trained_model.similarity('sushi', 'restaurant') + True + + """ + v1 = [self[word] for word in ws1] + v2 = [self[word] for word in ws2] + return dot(matutils.unitvec(array(v1).mean(axis=0)), matutils.unitvec(array(v2).mean(axis=0))) + + def init_sims(self, replace=False): + """ + Precompute L2-normalized vectors. + + If `replace` is set, forget the original vectors and only keep the normalized + ones = saves lots of memory! + + Note that you **cannot continue training** after doing a replace. The model becomes + effectively read-only = you can call `most_similar`, `similarity` etc., but not `train`. + + """ + if getattr(self, 'syn0norm', None) is None or replace: + logger.info("precomputing L2-norms of word weight vectors") + if replace: + for i in xrange(self.syn0.shape[0]): + self.syn0[i, :] /= sqrt((self.syn0[i, :] ** 2).sum(-1)) + self.syn0norm = self.syn0 + if hasattr(self, 'syn1'): + del self.syn1 + else: + self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL) + + def estimate_memory(self, vocab_size=None, report=None): + """Estimate required memory for a model using current settings and provided vocabulary size.""" + vocab_size = vocab_size or len(self.vocab) + report = report or {} + report['vocab'] = vocab_size * (700 if self.hs else 500) + report['syn0'] = vocab_size * self.vector_size * dtype(REAL).itemsize + if self.hs: + report['syn1'] = vocab_size * self.layer1_size * dtype(REAL).itemsize + if self.negative: + report['syn1neg'] = vocab_size * self.layer1_size * dtype(REAL).itemsize + report['total'] = sum(report.values()) + logger.info("estimated required memory for %i words and %i dimensions: %i bytes", + vocab_size, self.vector_size, report['total']) + return report + + @staticmethod + def log_accuracy(section): + correct, incorrect = len(section['correct']), len(section['incorrect']) + if correct + incorrect > 0: + logger.info("%s: %.1f%% (%i/%i)" % + (section['section'], 100.0 * correct / (correct + incorrect), + correct, correct + incorrect)) + + def accuracy(self, questions, restrict_vocab=30000, most_similar=most_similar): + """ + Compute accuracy of the model. `questions` is a filename where lines are + 4-tuples of words, split into sections by ": SECTION NAME" lines. + See https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt for an example. + + The accuracy is reported (=printed to log and returned as a list) for each + section separately, plus there's one aggregate summary at the end. + + Use `restrict_vocab` to ignore all questions containing a word whose frequency + is not in the top-N most frequent words (default top 30,000). + + This method corresponds to the `compute-accuracy` script of the original C word2vec. + + """ + ok_vocab = dict(sorted(iteritems(self.vocab), + key=lambda item: -item[1].count)[:restrict_vocab]) + ok_index = set(v.index for v in itervalues(ok_vocab)) + + sections, section = [], None + for line_no, line in enumerate(utils.smart_open(questions)): + # TODO: use level3 BLAS (=evaluate multiple questions at once), for speed + line = utils.to_unicode(line) + if line.startswith(': '): + # a new section starts => store the old section + if section: + sections.append(section) + self.log_accuracy(section) + section = {'section': line.lstrip(': ').strip(), 'correct': [], 'incorrect': []} + else: + if not section: + raise ValueError("missing section header before line #%i in %s" % (line_no, questions)) + try: + a, b, c, expected = [word.lower() for word in line.split()] # TODO assumes vocabulary preprocessing uses lowercase, too... + except: + logger.info("skipping invalid line #%i in %s" % (line_no, questions)) + if a not in ok_vocab or b not in ok_vocab or c not in ok_vocab or expected not in ok_vocab: + logger.debug("skipping line #%i with OOV words: %s" % (line_no, line.strip())) + continue + + ignore = set(self.vocab[v].index for v in [a, b, c]) # indexes of words to ignore + predicted = None + # find the most likely prediction, ignoring OOV words and input words + sims = most_similar(self, positive=[b, c], negative=[a], topn=False, restrict_vocab=restrict_vocab) + for index in matutils.argsort(sims, reverse=True): + if index in ok_index and index not in ignore: + predicted = self.index2word[index] + if predicted != expected: + logger.debug("%s: expected %s, predicted %s", line.strip(), expected, predicted) + break + if predicted == expected: + section['correct'].append((a, b, c, expected)) + else: + section['incorrect'].append((a, b, c, expected)) + if section: + # store the last section, too + sections.append(section) + self.log_accuracy(section) + + total = { + 'section': 'total', + 'correct': sum((s['correct'] for s in sections), []), + 'incorrect': sum((s['incorrect'] for s in sections), []), + } + self.log_accuracy(total) + sections.append(total) + return sections + + def __str__(self): + return "%s(vocab=%s, size=%s, alpha=%s)" % (self.__class__.__name__, len(self.index2word), self.vector_size, self.alpha) + + def save(self, *args, **kwargs): + # don't bother storing the cached normalized vectors, recalculable table + kwargs['ignore'] = kwargs.get('ignore', ['syn0norm', 'table', 'cum_table']) + super(Word2Vec, self).save(*args, **kwargs) + + save.__doc__ = utils.SaveLoad.save.__doc__ + + @classmethod + def load(cls, *args, **kwargs): + model = super(Word2Vec, cls).load(*args, **kwargs) + # update older models + if hasattr(model, 'table'): + delattr(model, 'table') # discard in favor of cum_table + if model.negative and hasattr(model, 'index2word'): + model.make_cum_table() # rebuild cum_table from vocabulary + if not hasattr(model, 'corpus_count'): + model.corpus_count = None + for v in model.vocab.values(): + if hasattr(v, 'sample_int'): + break # already 0.12.0+ style int probabilities + elif hasattr(v, 'sample_probability'): + v.sample_int = int(round(v.sample_probability * 2**32)) + del v.sample_probability + if not hasattr(model, 'syn0_lockf') and hasattr(model, 'syn0'): + model.syn0_lockf = ones(len(model.syn0), dtype=REAL) + if not hasattr(model, 'random'): + model.random = random.RandomState(model.seed) + if not hasattr(model, 'train_count'): + model.train_count = 0 + model.total_train_time = 0 + return model + + +class BrownCorpus(object): + """Iterate over sentences from the Brown corpus (part of NLTK data).""" + def __init__(self, dirname): + self.dirname = dirname + + def __iter__(self): + for fname in os.listdir(self.dirname): + fname = os.path.join(self.dirname, fname) + if not os.path.isfile(fname): + continue + for line in utils.smart_open(fname): + line = utils.to_unicode(line) + # each file line is a single sentence in the Brown corpus + # each token is WORD/POS_TAG + token_tags = [t.split('/') for t in line.split() if len(t.split('/')) == 2] + # ignore words with non-alphabetic tags like ",", "!" etc (punctuation, weird stuff) + words = ["%s/%s" % (token.lower(), tag[:2]) for token, tag in token_tags if tag[:2].isalpha()] + if not words: # don't bother sending out empty sentences + continue + yield words + + +class Text8Corpus(object): + """Iterate over sentences from the "text8" corpus, unzipped from http://mattmahoney.net/dc/text8.zip .""" + def __init__(self, fname, max_sentence_length=MAX_WORDS_IN_BATCH): + self.fname = fname + self.max_sentence_length = max_sentence_length + + def __iter__(self): + # the entire corpus is one gigantic line -- there are no sentence marks at all + # so just split the sequence of tokens arbitrarily: 1 sentence = 1000 tokens + sentence, rest = [], b'' + with utils.smart_open(self.fname) as fin: + while True: + text = rest + fin.read(8192) # avoid loading the entire file (=1 line) into RAM + if text == rest: # EOF + sentence.extend(rest.split()) # return the last chunk of words, too (may be shorter/longer) + if sentence: + yield sentence + break + last_token = text.rfind(b' ') # last token may have been split in two... keep for next iteration + words, rest = (utils.to_unicode(text[:last_token]).split(), + text[last_token:].strip()) if last_token >= 0 else ([], text) + sentence.extend(words) + while len(sentence) >= self.max_sentence_length: + yield sentence[:self.max_sentence_length] + sentence = sentence[self.max_sentence_length:] + + +class LineSentence(object): + """ + Simple format: one sentence = one line; words already preprocessed and separated by whitespace. + """ + + def __init__(self, source, max_sentence_length=MAX_WORDS_IN_BATCH, limit=None): + """ + `source` can be either a string or a file object. Clip the file to the first + `limit` lines (or no clipped if limit is None, the default). + + Example:: + + sentences = LineSentence('myfile.txt') + + Or for compressed files:: + + sentences = LineSentence('compressed_text.txt.bz2') + sentences = LineSentence('compressed_text.txt.gz') + + """ + self.source = source + self.max_sentence_length = max_sentence_length + self.limit = limit + + def __iter__(self): + """Iterate through the lines in the source.""" + try: + # Assume it is a file-like object and try treating it as such + # Things that don't have seek will trigger an exception + self.source.seek(0) + for line in itertools.islice(self.source, self.limit): + line = utils.to_unicode(line).split() + i = 0 + while i < len(line): + yield line[i : i + self.max_sentence_length] + i += self.max_sentence_length + except AttributeError: + # If it didn't work like a file, use it as a string filename + with utils.smart_open(self.source) as fin: + for line in itertools.islice(fin, self.limit): + line = utils.to_unicode(line).split() + i = 0 + while i < len(line): + yield line[i : i + self.max_sentence_length] + i += self.max_sentence_length + + +# Example: ./word2vec.py -train data.txt -output vec.txt -size 200 -window 5 -sample 1e-4 -negative 5 -hs 0 -binary 0 -cbow 1 -iter 3 +if __name__ == "__main__": + import argparse + logging.basicConfig( + format='%(asctime)s : %(threadName)s : %(levelname)s : %(message)s', + level=logging.INFO) + logging.info("running %s", " ".join(sys.argv)) + logging.info("using optimization %s", FAST_VERSION) + + + # check and process cmdline input + program = os.path.basename(sys.argv[0]) + if len(sys.argv) < 2: + print(globals()['__doc__'] % locals()) + sys.exit(1) + + from gensim.models.word2vec import Word2Vec # avoid referencing __main__ in pickle + + seterr(all='raise') # don't ignore numpy errors + + parser = argparse.ArgumentParser() + parser.add_argument("-train", help="Use text data from file TRAIN to train the model", required=True) + parser.add_argument("-output", help="Use file OUTPUT to save the resulting word vectors") + parser.add_argument("-window", help="Set max skip length WINDOW between words; default is 5", type=int, default=5) + parser.add_argument("-size", help="Set size of word vectors; default is 100", type=int, default=100) + parser.add_argument("-sample", help="Set threshold for occurrence of words. Those that appear with higher frequency in the training data will be randomly down-sampled; default is 1e-3, useful range is (0, 1e-5)", type=float, default=1e-3) + parser.add_argument("-hs", help="Use Hierarchical Softmax; default is 0 (not used)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-negative", help="Number of negative examples; default is 5, common values are 3 - 10 (0 = not used)", type=int, default=5) + parser.add_argument("-threads", help="Use THREADS threads (default 12)", type=int, default=12) + parser.add_argument("-iter", help="Run more training iterations (default 5)", type=int, default=5) + parser.add_argument("-min_count", help="This will discard words that appear less than MIN_COUNT times; default is 5", type=int, default=5) + parser.add_argument("-cbow", help="Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)", type=int, default=1, choices=[0, 1]) + parser.add_argument("-binary", help="Save the resulting vectors in binary mode; default is 0 (off)", type=int, default=0, choices=[0, 1]) + parser.add_argument("-accuracy", help="Use questions from file ACCURACY to evaluate the model") + + args = parser.parse_args() + + if args.cbow == 0: + skipgram = 1 + else: + skipgram = 0 + + corpus = LineSentence(args.train) + + model = Word2Vec(corpus, size=args.size, min_count=args.min_count, workers=args.threads, window=args.window,sample=args.sample,sg=skipgram,hs=args.hs,negative=args.negative,cbow_mean=1,iter=args.iter) + + if args.output: + outfile = args.output + model.save_word2vec_format(outfile, binary=args.binary) + else: + outfile = args.train + model.save(outfile + '.model') + if args.binary == 1: + model.save_word2vec_format(outfile + '.model.bin', binary=True) + else: + model.save_word2vec_format(outfile + '.model.txt', binary=False) + + if args.accuracy: + questions_file = args.accuracy + model.accuracy(questions_file) + + logger.info("finished running %s", program) diff --git a/syntax_model_files/script_to_model.py b/syntax_model_files/script_to_model.py new file mode 100644 index 0000000000..005603138e --- /dev/null +++ b/syntax_model_files/script_to_model.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Jun 15 04:54:50 2016 + +@author: robert +""" + +import pickle + +# use nltk.download() to download stopwords corpus if not yet + + + + +# Iterable to be passed to word2vec class as sentences. +# reads sentences one by one from picke dump + +class SentIterable(object): + +# correct path to parsed corpus dump HERE + + dumpPath = '/run/media/robert/1TB-1/linuxfolder/pythonworks/corporaDump' + # dumpPath = '/run/media/robert/1TB-1/linuxfolder/pythonworks/miniCorp' + dumpOpened = open(dumpPath, 'rb') +# pickleDump = open(dumpPath, 'rb') + sentCount = 10000000000 + +# self.sentCount to be inherited (got?) while creating context 86468867 +#minicorpus length 3410461 + def __iter__(self): + try: + for sent in range(self.sentCount): + yield pickle.load(self.dumpOpened) + except EOFError: + print('Pickler Done') + self.dumpOpened = open(self.dumpPath, 'rb') + + + +class ContIterable(object): + +# correct path to parsed corpus dump HERE + + dumpPath = '/run/media/robert/1TB-1/linuxfolder/pythonworks/contDumpFinal' + # dumpPath = '/run/media/robert/1TB-1/linuxfolder/pythonworks/miniCont' + dumpOpened = open(dumpPath, 'rb') +# pickleDump = open(dumpPath, 'rb') + sentCount = 10000000000 + +# self.sentCount to be inherited (got?) while creating context 98366448 +#minicorpus length 3410461 + def __iter__(self): + try: + for sent in range(self.sentCount): + yield pickle.load(self.dumpOpened) + except EOFError: + print('Pickler for synt Done') + self.dumpOpened = open(self.dumpPath, 'rb') + + + + + + +import logging +logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',\ + level=logging.INFO) + + + +num_features = 500 # Word vector dimensionality +min_word_count = 100 # Minimum word count +num_workers = 4 # Number of threads to run in parallel +context = 2 # Context window size +downsampling = 1e-3 # Downsample setting for frequent words + + +#from gensim.models import word2vec_synt +#print("Training model...") +#model = word2vec_synt.Word2Vec(SentIterable(), workers=num_workers, \ +# size=num_features, min_count = min_word_count, \ +# window = context, sample = downsampling, sg = 1, hs = 1, negative = 0, +# synt_cash = ContIterable()) + +sentences = ContIterable() +from gensim.models import word2vec_synt +print("Training model...") +model = word2vec_synt.Word2Vec(sentences, workers=num_workers, \ + size=num_features, min_count = min_word_count, \ + window = context, sample = downsampling, sg = 1) diff --git a/syntax_model_files/sdasd.txt b/syntax_model_files/sdasd.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/syntax_model_files/syntax_model b/syntax_model_files/syntax_model new file mode 100644 index 0000000000000000000000000000000000000000..bbfc983625ff00518c9868fc37720e60dceb7d30 GIT binary patch literal 6214111 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 j?Wbx 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%0AJS$M-^pbN4UJMa>9wR6aVe#M$U|HQH{-<-Y+XK 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ΞC-OK_$;QU{)N>zbzMH2-!D? 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

R_)=R5Y3JvUCGofsxVbd$ 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

Tx6h!rO(Gc)x%gwCIa+vH79N@S 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˾N5Nq@(mfX*Iqg9s^Yp^s^ZKA{mb1#0 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�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 z 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

_BA_@`6iFFdd;y%PXEhg{#sM)G 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 +?BBUlb|^{%TbDk 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

RfwP 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

Wr%V-*=j3 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

jTwSSBzzLQR00sH^Y1UusJd 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

I>CRS5dhN7j`Dq@P(-UPyPCjiU)F@qT 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

4<-;6Xv%n<(vn+4s=6BL2-urt*M|n57?oFl<+3p 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 z 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%0Ddi!5)?>URW;dHP{=KdB?f!<||B(A!YF& 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

wr(sNkny#z-tiDYpH8X`= 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�o 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

&yZta>IbB$3twZBUVy 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%0D+d)fYm6`Vwk6&%;%8oxM=|R26885(Ztd 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

7I@QozM|?Pisy0)W*qmPXe9N(P0~@ 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

~mpuPVa=QpIPADhK81%0JOA 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 z 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%0A}D6<60Kf0rwr$(yTs^g>=Cqv} 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%0D2Wv^^joVoeE_1T3k_yb@d+A!|~wiq5De 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 zgeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_R zN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6 zqJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74C zAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS z5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcN zC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0O zh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAo zgeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_R zN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6 zqJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74C zAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS z5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcN zC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0O zh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAo zgeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_R zN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6 zqJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74C zAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS z5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcN zC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0O zh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAo zgeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_R zN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6 zqJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74C zAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS z5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcN zC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0O zh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAo zgeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_R zN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6 zqJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74C zAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS z5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcN zC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0O zh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAo zgeW0Oh!UcNC?QIS5~74CAxel6qJ$_RN{AAogeW0Oh!UcNC?QIS5~74CAxel6qJ$_R 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 Date: Thu, 8 Dec 2016 19:58:37 +0300 Subject: [PATCH 30/33] Initial shippable release --- .../gensim/models/compile_cython.py | 2 +- syntax_model_files/gensim/models/voidptr.h | 17 + .../models/{word2vec_synt.py => word2vec.py} | 12 +- .../gensim/models/word2vec_inner.c | 13695 ++++++++++++++++ .../gensim/models/word2vec_inner.pxd | 54 + .../gensim/models/word2vec_inner.pyx | 725 + syntax_model_files/script_to_model.py | 6 +- 7 files changed, 14504 insertions(+), 7 deletions(-) create mode 100644 syntax_model_files/gensim/models/voidptr.h rename syntax_model_files/gensim/models/{word2vec_synt.py => word2vec.py} (99%) create mode 100644 syntax_model_files/gensim/models/word2vec_inner.c create mode 100644 syntax_model_files/gensim/models/word2vec_inner.pxd create mode 100644 syntax_model_files/gensim/models/word2vec_inner.pyx diff --git a/syntax_model_files/gensim/models/compile_cython.py b/syntax_model_files/gensim/models/compile_cython.py index 00b9f05532..217c6b5d55 100644 --- a/syntax_model_files/gensim/models/compile_cython.py +++ b/syntax_model_files/gensim/models/compile_cython.py @@ -10,4 +10,4 @@ import numpy -setup(ext_modules=cythonize('/run/media/robert/1TB-1/linuxfolder/anaconda3/lib/python3.5/site-packages/gensim/models/word2vec_inner_synt2.pyx'), include_dirs=[numpy.get_include()]) \ No newline at end of file +setup(ext_modules=cythonize('/run/media/robert/1TB-1/linuxfolder/gitlair/word2vec_syntax/gensim/models/word2vec_inner_in_works.pyx'), include_dirs=[numpy.get_include()]) \ No newline at end of file diff --git a/syntax_model_files/gensim/models/voidptr.h b/syntax_model_files/gensim/models/voidptr.h new file mode 100644 index 0000000000..89f7d4c70f --- /dev/null +++ b/syntax_model_files/gensim/models/voidptr.h @@ -0,0 +1,17 @@ +#include + +#if PY_VERSION_HEX >= 0x03020000 + +/* +** compatibility with python >= 3.2, which doesn't have CObject anymore +*/ +static void * PyCObject_AsVoidPtr(PyObject *obj) +{ + void *ret = PyCapsule_GetPointer(obj, NULL); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} + +#endif \ No newline at end of file diff --git a/syntax_model_files/gensim/models/word2vec_synt.py b/syntax_model_files/gensim/models/word2vec.py similarity index 99% rename from syntax_model_files/gensim/models/word2vec_synt.py rename to syntax_model_files/gensim/models/word2vec.py index 004ef57708..d36ad43dcc 100644 --- a/syntax_model_files/gensim/models/word2vec_synt.py +++ b/syntax_model_files/gensim/models/word2vec.py @@ -97,9 +97,9 @@ logger = logging.getLogger(__name__) try: - from gensim.models.word2vec_inner_synt2 import train_batch_sg, train_batch_cbow - from gensim.models.word2vec_inner_synt2 import score_sentence_sg, score_sentence_cbow - from gensim.models.word2vec_inner_synt2 import FAST_VERSION, MAX_WORDS_IN_BATCH + from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow + from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow + from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH except ImportError: # failed... fall back to plain numpy (20-80x slower training than the above) FAST_VERSION = -1 @@ -344,7 +344,7 @@ class Word2Vec(utils.SaveLoad): def __init__( self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001, - sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0, + sg=0, hs=0, negative=5, cbow_mean=1, synt_cont=0, hashfxn=hash, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH): """ Initialize the model from an iterable of `sentences`. Each sentence is a @@ -390,6 +390,9 @@ def __init__( `cbow_mean` = if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used. + + 'synt_cont' = if 1, syntax-based context approach is used, and the input corpora + is expected to be formatted accordingly. If 0 (default), standard bag-of-words is expected. `hashfxn` = hash function to use to randomly initialize weights, for increased training reproducibility. Default is Python's rudimentary built in hash function. @@ -431,6 +434,7 @@ def __init__( self.hs = hs self.negative = negative self.cbow_mean = int(cbow_mean) + self.synt_cont = int(synt_cont) self.hashfxn = hashfxn self.iter = iter self.null_word = null_word diff --git a/syntax_model_files/gensim/models/word2vec_inner.c b/syntax_model_files/gensim/models/word2vec_inner.c new file mode 100644 index 0000000000..3376cd817c --- /dev/null +++ b/syntax_model_files/gensim/models/word2vec_inner.c @@ -0,0 +1,13695 @@ +/* Generated by Cython 0.23.4 */ + +/* BEGIN: Cython Metadata +{ + "distutils": { + "depends": [ + "/run/media/robert/1TB-1/linuxfolder/gitlair/word2vec_syntax/gensim/models/voidptr.h" + ] + } +} +END: Cython Metadata */ + +#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_23_4" +#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 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_CPYTHON 0 +#else +#define CYTHON_COMPILING_IN_PYPY 0 +#define CYTHON_COMPILING_IN_CPYTHON 1 +#endif +#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000 +#define CYTHON_USE_PYLONG_INTERNALS 1 +#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 +#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_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) +#else + #define CYTHON_PEP393_ENABLED 0 + #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_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])) +#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 +#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 + #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) +#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 PY_VERSION_HEX >= 0x030500B1 +#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods +#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) +#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 +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)) +#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 +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) + +#ifndef CYTHON_INLINE + #if 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 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__word2vec_inner_in_works +#define __PYX_HAVE_API__word2vec_inner_in_works +#include "voidptr.h" +#include "string.h" +#include "stdio.h" +#include "stdlib.h" +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include "math.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#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_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +typedef struct {PyObject **p; 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_Int(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_COMPILING_IN_CPYTHON +#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 && __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 int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +#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[] = { + "word2vec_inner_in_works.pyx", + "__init__.pxd", + "type.pxd", +}; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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_in_works.pxd":12 + * + * cimport numpy as np + * ctypedef np.float32_t REAL_t # <<<<<<<<<<<<<< + * + * # BLAS routine signatures + */ +typedef __pyx_t_5numpy_float32_t __pyx_t_23word2vec_inner_in_works_REAL_t; +#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 + +#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 + + +/*--- Type declarations ---*/ + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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; + +/* "../../../../anaconda3/lib/python3.5/site-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_in_works.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_23word2vec_inner_in_works_scopy_ptr)(int const *, float const *, int const *, float *, int const *); + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_saxpy_ptr)(int const *, float const *, float const *, int const *, float *, int const *); + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_sdot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_dsdot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_snrm2_ptr)(int const *, float const *, int const *); + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_sscal_ptr)(int const *, float const *, float const *, int const *); + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_REAL_t (*__pyx_t_23word2vec_inner_in_works_our_dot_ptr)(int const *, float const *, int const *, float const *, int const *); + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_our_saxpy_ptr)(int const *, float const *, float const *, int const *, float *, int const *); + +/* --- Runtime support code (head) --- */ +#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) + +#if CYTHON_COMPILING_IN_CPYTHON +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 + +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +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); + +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +#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 + +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)); +} + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +#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 + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb); +static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb); + +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +#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 + +typedef struct { + int code_line; + PyCodeObject* code_object; +} __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); + +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_As_PY_LONG_LONG(PyObject *); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); + +static CYTHON_INLINE npy_uint32 __Pyx_PyInt_As_npy_uint32(PyObject *); + +#ifndef __PYX_FORCE_INIT_THREADS + #define __PYX_FORCE_INIT_THREADS 0 +#endif + +static CYTHON_INLINE long __Pyx_pow_long(long, long); + +#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(_WIN32) || defined(__clang__)) && defined(__cplusplus) && CYTHON_CCOMPLEX + #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 + +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eqf(a, b) ((a)==(b)) + #define __Pyx_c_sumf(a, b) ((a)+(b)) + #define __Pyx_c_difff(a, b) ((a)-(b)) + #define __Pyx_c_prodf(a, b) ((a)*(b)) + #define __Pyx_c_quotf(a, b) ((a)/(b)) + #define __Pyx_c_negf(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zerof(z) ((z)==(float)0) + #define __Pyx_c_conjf(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_absf(z) (::std::abs(z)) + #define __Pyx_c_powf(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zerof(z) ((z)==0) + #define __Pyx_c_conjf(z) (conjf(z)) + #if 1 + #define __Pyx_c_absf(z) (cabsf(z)) + #define __Pyx_c_powf(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq(a, b) ((a)==(b)) + #define __Pyx_c_sum(a, b) ((a)+(b)) + #define __Pyx_c_diff(a, b) ((a)-(b)) + #define __Pyx_c_prod(a, b) ((a)*(b)) + #define __Pyx_c_quot(a, b) ((a)/(b)) + #define __Pyx_c_neg(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero(z) ((z)==(double)0) + #define __Pyx_c_conj(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs(z) (::std::abs(z)) + #define __Pyx_c_pow(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero(z) ((z)==0) + #define __Pyx_c_conj(z) (conj(z)) + #if 1 + #define __Pyx_c_abs(z) (cabs(z)) + #define __Pyx_c_pow(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +static int __Pyx_check_binary_version(void); + +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL) +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_setattro)) + return tp->tp_setattro(obj, attr_name, value); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_setattr)) + return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value); +#endif + return PyObject_SetAttr(obj, attr_name, value); +} +#else +#define __Pyx_PyObject_DelAttrStr(o,n) PyObject_DelAttr(o,n) +#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v) +#endif + +static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig); + +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); + +#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 + +static PyObject *__Pyx_ImportModule(const char *name); + +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* 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 'cython' */ + +/* Module declarations from 'libc.math' */ + +/* Module declarations from 'word2vec_inner_in_works' */ +static __pyx_t_23word2vec_inner_in_works_scopy_ptr __pyx_v_23word2vec_inner_in_works_scopy; +static __pyx_t_23word2vec_inner_in_works_saxpy_ptr __pyx_v_23word2vec_inner_in_works_saxpy; +static __pyx_t_23word2vec_inner_in_works_sdot_ptr __pyx_v_23word2vec_inner_in_works_sdot; +static __pyx_t_23word2vec_inner_in_works_dsdot_ptr __pyx_v_23word2vec_inner_in_works_dsdot; +static __pyx_t_23word2vec_inner_in_works_snrm2_ptr __pyx_v_23word2vec_inner_in_works_snrm2; +static __pyx_t_23word2vec_inner_in_works_sscal_ptr __pyx_v_23word2vec_inner_in_works_sscal; +static __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_23word2vec_inner_in_works_EXP_TABLE[0x3E8]; +static __pyx_t_23word2vec_inner_in_works_our_dot_ptr __pyx_v_23word2vec_inner_in_works_our_dot; +static __pyx_t_23word2vec_inner_in_works_our_saxpy_ptr __pyx_v_23word2vec_inner_in_works_our_saxpy; +static __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_23word2vec_inner_in_works_LOG_TABLE[0x3E8]; +static int __pyx_v_23word2vec_inner_in_works_ONE; +static __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_23word2vec_inner_in_works_ONEF; +static __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_f_23word2vec_inner_in_works_our_dot_double(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_f_23word2vec_inner_in_works_our_dot_float(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_f_23word2vec_inner_in_works_our_dot_noblas(int const *, float const *, int const *, float const *, int const *); /*proto*/ +static void __pyx_f_23word2vec_inner_in_works_our_saxpy_noblas(int const *, float const *, float const *, int const *, float *, int const *); /*proto*/ +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_bisect_left(__pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG, unsigned PY_LONG_LONG); /*proto*/ +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_random_int32(unsigned PY_LONG_LONG *); /*proto*/ +static void __pyx_f_23word2vec_inner_in_works_fast_sentence_sg_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int const , __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, int const , __pyx_t_5numpy_uint32_t const , __pyx_t_23word2vec_inner_in_works_REAL_t const , __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *); /*proto*/ +static unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_fast_sentence_sg_neg(int const , __pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, int const , __pyx_t_5numpy_uint32_t const , __pyx_t_5numpy_uint32_t const , __pyx_t_23word2vec_inner_in_works_REAL_t const , __pyx_t_23word2vec_inner_in_works_REAL_t *, unsigned PY_LONG_LONG, __pyx_t_23word2vec_inner_in_works_REAL_t *); /*proto*/ +static void __pyx_f_23word2vec_inner_in_works_fast_sentence_cbow_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int *, __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_23word2vec_inner_in_works_REAL_t const , __pyx_t_23word2vec_inner_in_works_REAL_t *, int, int, int, int, __pyx_t_23word2vec_inner_in_works_REAL_t *); /*proto*/ +static unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_fast_sentence_cbow_neg(int const , __pyx_t_5numpy_uint32_t *, unsigned PY_LONG_LONG, int *, __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_23word2vec_inner_in_works_REAL_t const , __pyx_t_23word2vec_inner_in_works_REAL_t *, int, int, int, int, unsigned PY_LONG_LONG, __pyx_t_23word2vec_inner_in_works_REAL_t *); /*proto*/ +static void __pyx_f_23word2vec_inner_in_works_score_pair_sg_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int const , __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, int const , __pyx_t_5numpy_uint32_t const , __pyx_t_23word2vec_inner_in_works_REAL_t *); /*proto*/ +static void __pyx_f_23word2vec_inner_in_works_score_pair_cbow_hs(__pyx_t_5numpy_uint32_t const *, __pyx_t_5numpy_uint8_t const *, int *, __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, __pyx_t_23word2vec_inner_in_works_REAL_t *, int const , __pyx_t_5numpy_uint32_t const *, __pyx_t_23word2vec_inner_in_works_REAL_t *, int, int, int, int); /*proto*/ +#define __Pyx_MODULE_NAME "word2vec_inner_in_works" +int __pyx_module_is_main_word2vec_inner_in_works = 0; + +/* Implementation of 'word2vec_inner_in_works' */ +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 char __pyx_k_B[] = "B"; +static char __pyx_k_H[] = "H"; +static char __pyx_k_I[] = "I"; +static char __pyx_k_L[] = "L"; +static char __pyx_k_O[] = "O"; +static char __pyx_k_Q[] = "Q"; +static char __pyx_k_b[] = "b"; +static char __pyx_k_d[] = "d"; +static char __pyx_k_f[] = "f"; +static char __pyx_k_g[] = "g"; +static char __pyx_k_h[] = "h"; +static char __pyx_k_i[] = "i"; +static char __pyx_k_j[] = "j"; +static char __pyx_k_k[] = "k"; +static char __pyx_k_l[] = "l"; +static char __pyx_k_q[] = "q"; +static char __pyx_k_x[] = "x"; +static char __pyx_k_y[] = "y"; +static char __pyx_k_Zd[] = "Zd"; +static char __pyx_k_Zf[] = "Zf"; +static char __pyx_k_Zg[] = "Zg"; +static char __pyx_k_hs[] = "hs"; +static char __pyx_k_np[] = "np"; +static char __pyx_k_sc[] = "sc"; +static char __pyx_k__11[] = "*"; +static char __pyx_k_REAL[] = "REAL"; +static char __pyx_k_code[] = "code"; +static char __pyx_k_init[] = "init"; +static char __pyx_k_item[] = "item"; +static char __pyx_k_main[] = "__main__"; +static char __pyx_k_neu1[] = "_neu1"; +static char __pyx_k_sdot[] = "sdot"; +static char __pyx_k_sent[] = "sent"; +static char __pyx_k_size[] = "size"; +static char __pyx_k_syn0[] = "syn0"; +static char __pyx_k_syn1[] = "syn1"; +static char __pyx_k_test[] = "__test__"; +static char __pyx_k_word[] = "word"; +static char __pyx_k_work[] = "_work"; +static char __pyx_k_alpha[] = "alpha"; +static char __pyx_k_codes[] = "codes"; +static char __pyx_k_d_res[] = "d_res"; +static char __pyx_k_dsdot[] = "dsdot"; +static char __pyx_k_fblas[] = "fblas"; +static char __pyx_k_index[] = "index"; +static char __pyx_k_model[] = "model"; +static char __pyx_k_numpy[] = "numpy"; +static char __pyx_k_p_res[] = "p_res"; +static char __pyx_k_point[] = "point"; +static char __pyx_k_range[] = "range"; +static char __pyx_k_saxpy[] = "saxpy"; +static char __pyx_k_scopy[] = "scopy"; +static char __pyx_k_snrm2[] = "snrm2"; +static char __pyx_k_sscal[] = "sscal"; +static char __pyx_k_token[] = "token"; +static char __pyx_k_vocab[] = "vocab"; +static char __pyx_k_import[] = "__import__"; +static char __pyx_k_neu1_2[] = "neu1"; +static char __pyx_k_points[] = "points"; +static char __pyx_k_random[] = "random"; +static char __pyx_k_result[] = "result"; +static char __pyx_k_sample[] = "sample"; +static char __pyx_k_window[] = "window"; +static char __pyx_k_work_2[] = "work"; +static char __pyx_k_alpha_2[] = "_alpha"; +static char __pyx_k_float32[] = "float32"; +static char __pyx_k_idx_end[] = "idx_end"; +static char __pyx_k_indexes[] = "indexes"; +static char __pyx_k_our_dot[] = "our_dot"; +static char __pyx_k_randint[] = "randint"; +static char __pyx_k_syn1neg[] = "syn1neg"; +static char __pyx_k_vlookup[] = "vlookup"; +static char __pyx_k_codelens[] = "codelens"; +static char __pyx_k_cpointer[] = "_cpointer"; +static char __pyx_k_expected[] = "expected"; +static char __pyx_k_negative[] = "negative"; +static char __pyx_k_pyx_capi[] = "__pyx_capi__"; +static char __pyx_k_sent_idx[] = "sent_idx"; +static char __pyx_k_sentence[] = "sentence"; +static char __pyx_k_EXP_TABLE[] = "EXP_TABLE"; +static char __pyx_k_cbow_mean[] = "cbow_mean"; +static char __pyx_k_cum_table[] = "cum_table"; +static char __pyx_k_enumerate[] = "enumerate"; +static char __pyx_k_idx_start[] = "idx_start"; +static char __pyx_k_our_saxpy[] = "our_saxpy"; +static char __pyx_k_sentences[] = "sentences"; +static char __pyx_k_synt_cont[] = "synt_cont"; +static char __pyx_k_ValueError[] = "ValueError"; +static char __pyx_k_sample_int[] = "sample_int"; +static char __pyx_k_syn0_lockf[] = "syn0_lockf"; +static char __pyx_k_word_locks[] = "word_locks"; +static char __pyx_k_ImportError[] = "ImportError"; +static char __pyx_k_layer1_size[] = "layer1_size"; +static char __pyx_k_next_random[] = "next_random"; +static char __pyx_k_FAST_VERSION[] = "FAST_VERSION"; +static char __pyx_k_RuntimeError[] = "RuntimeError"; +static char __pyx_k_sentence_idx[] = "sentence_idx"; +static char __pyx_k_sentence_len[] = "sentence_len"; +static char __pyx_k_cum_table_len[] = "cum_table_len"; +static char __pyx_k_train_batch_sg[] = "train_batch_sg"; +static char __pyx_k_effective_words[] = "effective_words"; +static char __pyx_k_reduced_windows[] = "reduced_windows"; +static char __pyx_k_train_batch_cbow[] = "train_batch_cbow"; +static char __pyx_k_scipy_linalg_blas[] = "scipy.linalg.blas"; +static char __pyx_k_score_sentence_sg[] = "score_sentence_sg"; +static char __pyx_k_MAX_WORDS_IN_BATCH[] = "MAX_WORDS_IN_BATCH"; +static char __pyx_k_effective_sentences[] = "effective_sentences"; +static char __pyx_k_score_sentence_cbow[] = "score_sentence_cbow"; +static char __pyx_k_word2vec_inner_in_works[] = "word2vec_inner_in_works"; +static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static char __pyx_k_run_media_robert_1TB_1_linuxfol[] = "/run/media/robert/1TB-1/linuxfolder/gitlair/word2vec_syntax/gensim/models/word2vec_inner_in_works.pyx"; +static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_EXP_TABLE; +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__11; +static PyObject *__pyx_n_s_alpha; +static PyObject *__pyx_n_s_alpha_2; +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_cpointer; +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_dsdot; +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_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_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_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_np; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_n_s_our_dot; +static PyObject *__pyx_n_s_our_saxpy; +static PyObject *__pyx_n_s_p_res; +static PyObject *__pyx_n_s_point; +static PyObject *__pyx_n_s_points; +static PyObject *__pyx_n_s_pyx_capi; +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_result; +static PyObject *__pyx_kp_s_run_media_robert_1TB_1_linuxfol; +static PyObject *__pyx_n_s_sample; +static PyObject *__pyx_n_s_sample_int; +static PyObject *__pyx_n_s_saxpy; +static PyObject *__pyx_n_s_sc; +static PyObject *__pyx_n_s_scipy_linalg_blas; +static PyObject *__pyx_n_s_scopy; +static PyObject *__pyx_n_s_score_sentence_cbow; +static PyObject *__pyx_n_s_score_sentence_sg; +static PyObject *__pyx_n_s_sdot; +static PyObject *__pyx_n_s_sent; +static PyObject *__pyx_n_s_sent_idx; +static PyObject *__pyx_n_s_sentence; +static PyObject *__pyx_n_s_sentence_idx; +static PyObject *__pyx_n_s_sentence_len; +static PyObject *__pyx_n_s_sentences; +static PyObject *__pyx_n_s_size; +static PyObject *__pyx_n_s_snrm2; +static PyObject *__pyx_n_s_sscal; +static PyObject *__pyx_n_s_syn0; +static PyObject *__pyx_n_s_syn0_lockf; +static PyObject *__pyx_n_s_syn1; +static PyObject *__pyx_n_s_syn1neg; +static PyObject *__pyx_n_s_synt_cont; +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_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_word2vec_inner_in_works; +static PyObject *__pyx_n_s_word_locks; +static PyObject *__pyx_n_s_work; +static PyObject *__pyx_n_s_work_2; +static PyObject *__pyx_n_s_x; +static PyObject *__pyx_n_s_y; +static PyObject *__pyx_pf_23word2vec_inner_in_works_train_batch_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work); /* proto */ +static PyObject *__pyx_pf_23word2vec_inner_in_works_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_23word2vec_inner_in_works_4score_sentence_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work); /* proto */ +static PyObject *__pyx_pf_23word2vec_inner_in_works_6score_sentence_cbow(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work, PyObject *__pyx_v__neu1); /* proto */ +static PyObject *__pyx_pf_23word2vec_inner_in_works_8init(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__12; +static PyObject *__pyx_tuple__14; +static PyObject *__pyx_tuple__16; +static PyObject *__pyx_tuple__18; +static PyObject *__pyx_tuple__20; +static PyObject *__pyx_codeobj__13; +static PyObject *__pyx_codeobj__15; +static PyObject *__pyx_codeobj__17; +static PyObject *__pyx_codeobj__19; +static PyObject *__pyx_codeobj__21; + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_REAL_t __pyx_f_23word2vec_inner_in_works_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) { + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_r; + + /* "word2vec_inner_in_works.pyx":47 + * # 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_23word2vec_inner_in_works_REAL_t)__pyx_v_23word2vec_inner_in_works_dsdot(__pyx_v_N, __pyx_v_X, __pyx_v_incX, __pyx_v_Y, __pyx_v_incY)); + goto __pyx_L0; + + /* "word2vec_inner_in_works.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 */ + __pyx_L0:; + return __pyx_r; +} + +/* "word2vec_inner_in_works.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_23word2vec_inner_in_works_REAL_t __pyx_f_23word2vec_inner_in_works_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) { + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_r; + + /* "word2vec_inner_in_works.pyx":51 + * # 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_23word2vec_inner_in_works_REAL_t)__pyx_v_23word2vec_inner_in_works_sdot(__pyx_v_N, __pyx_v_X, __pyx_v_incX, __pyx_v_Y, __pyx_v_incY)); + goto __pyx_L0; + + /* "word2vec_inner_in_works.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 */ + __pyx_L0:; + return __pyx_r; +} + +/* "word2vec_inner_in_works.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 + * cdef int i + */ + +static __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_f_23word2vec_inner_in_works_our_dot_noblas(int const *__pyx_v_N, float const *__pyx_v_X, CYTHON_UNUSED int const *__pyx_v_incX, float const *__pyx_v_Y, CYTHON_UNUSED int const *__pyx_v_incY) { + int __pyx_v_i; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_a; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_r; + int __pyx_t_1; + + /* "word2vec_inner_in_works.pyx":58 + * cdef int i + * cdef REAL_t a + * a = 0.0 # <<<<<<<<<<<<<< + * for i from 0 <= i < N[0] by 1: + * a += X[i] * Y[i] + */ + __pyx_v_a = ((__pyx_t_23word2vec_inner_in_works_REAL_t)0.0); + + /* "word2vec_inner_in_works.pyx":59 + * cdef REAL_t a + * a = 0.0 + * for i from 0 <= i < N[0] by 1: # <<<<<<<<<<<<<< + * a += X[i] * Y[i] + * return a + */ + __pyx_t_1 = (__pyx_v_N[0]); + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_1; __pyx_v_i+=1) { + + /* "word2vec_inner_in_works.pyx":60 + * a = 0.0 + * 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]))); + } + + /* "word2vec_inner_in_works.pyx":61 + * 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; + + /* "word2vec_inner_in_works.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 + * cdef int i + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "word2vec_inner_in_works.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 + * for i from 0 <= i < N[0] by 1: + */ + +static void __pyx_f_23word2vec_inner_in_works_our_saxpy_noblas(int const *__pyx_v_N, float const *__pyx_v_alpha, float const *__pyx_v_X, int const *__pyx_v_incX, float *__pyx_v_Y, int const *__pyx_v_incY) { + int __pyx_v_i; + int __pyx_t_1; + + /* "word2vec_inner_in_works.pyx":66 + * 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 + * 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) { + + /* "word2vec_inner_in_works.pyx":67 + * 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]))])); + } + + /* "word2vec_inner_in_works.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 + * for i from 0 <= i < N[0] by 1: + */ + + /* function exit code */ +} + +/* "word2vec_inner_in_works.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, + */ + +static void __pyx_f_23word2vec_inner_in_works_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_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const __pyx_v_word2_index, __pyx_t_23word2vec_inner_in_works_REAL_t const __pyx_v_alpha, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_f; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_g; + int __pyx_t_1; + PY_LONG_LONG __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "word2vec_inner_in_works.pyx":76 + * + * cdef long long a, b + * cdef long long row1 = word2_index * size, row2 # <<<<<<<<<<<<<< + * cdef REAL_t f, g + * + */ + __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":79 + * cdef REAL_t f, g + * + * memset(work, 0, size * cython.sizeof(REAL_t)) # <<<<<<<<<<<<<< + * for b in range(codelen): + * row2 = word_point[b] * size + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_23word2vec_inner_in_works_REAL_t)))); + + /* "word2vec_inner_in_works.pyx":80 + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelen): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + */ + __pyx_t_1 = __pyx_v_codelen; + for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_b = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":81 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelen): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":82 + * for b in range(codelen): + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_23word2vec_inner_in_works_our_dot((&__pyx_v_size), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":83 + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L6_bool_binop_done:; + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":84 + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":83 + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "word2vec_inner_in_works.pyx":85 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_f = (__pyx_v_23word2vec_inner_in_works_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "word2vec_inner_in_works.pyx":86 + * continue + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1[row2], &ONE) + */ + __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); + + /* "word2vec_inner_in_works.pyx":87 + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1[row2], &ONE) + * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":88 + * g = (1 - word_code[b] - f) * alpha + * 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_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + __pyx_L3_continue:; + } + + /* "word2vec_inner_in_works.pyx":89 + * 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_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.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, + */ + + /* function exit code */ +} + +/* "word2vec_inner_in_works.pyx":93 + * + * # 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 + * while hi > lo: + */ + +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_bisect_left(__pyx_t_5numpy_uint32_t *__pyx_v_a, unsigned PY_LONG_LONG __pyx_v_x, unsigned PY_LONG_LONG __pyx_v_lo, unsigned PY_LONG_LONG __pyx_v_hi) { + unsigned PY_LONG_LONG __pyx_v_mid; + unsigned PY_LONG_LONG __pyx_r; + int __pyx_t_1; + + /* "word2vec_inner_in_works.pyx":95 + * 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 + * while hi > lo: # <<<<<<<<<<<<<< + * mid = (lo + hi) >> 1 + * if a[mid] >= x: + */ + while (1) { + __pyx_t_1 = ((__pyx_v_hi > __pyx_v_lo) != 0); + if (!__pyx_t_1) break; + + /* "word2vec_inner_in_works.pyx":96 + * cdef unsigned long long mid + * while hi > lo: + * mid = (lo + hi) >> 1 # <<<<<<<<<<<<<< + * if a[mid] >= x: + * hi = mid + */ + __pyx_v_mid = ((__pyx_v_lo + __pyx_v_hi) >> 1); + + /* "word2vec_inner_in_works.pyx":97 + * while hi > lo: + * mid = (lo + hi) >> 1 + * if a[mid] >= x: # <<<<<<<<<<<<<< + * hi = mid + * else: + */ + __pyx_t_1 = (((__pyx_v_a[__pyx_v_mid]) >= __pyx_v_x) != 0); + if (__pyx_t_1) { + + /* "word2vec_inner_in_works.pyx":98 + * mid = (lo + hi) >> 1 + * if a[mid] >= x: + * hi = mid # <<<<<<<<<<<<<< + * else: + * lo = mid + 1 + */ + __pyx_v_hi = __pyx_v_mid; + + /* "word2vec_inner_in_works.pyx":97 + * while hi > lo: + * mid = (lo + hi) >> 1 + * if a[mid] >= x: # <<<<<<<<<<<<<< + * hi = mid + * else: + */ + goto __pyx_L5; + } + + /* "word2vec_inner_in_works.pyx":100 + * hi = mid + * else: + * lo = mid + 1 # <<<<<<<<<<<<<< + * return lo + * + */ + /*else*/ { + __pyx_v_lo = (__pyx_v_mid + 1); + } + __pyx_L5:; + } + + /* "word2vec_inner_in_works.pyx":101 + * 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; + + /* "word2vec_inner_in_works.pyx":93 + * + * # 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 + * while hi > lo: + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "word2vec_inner_in_works.pyx":105 + * # this quick & dirty RNG apparently matches Java's (non-Secure)Random + * # note this function side-effects next_random to set up the next number + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: # <<<<<<<<<<<<<< + * cdef unsigned long long this_random = next_random[0] >> 16 + * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL + */ + +static CYTHON_INLINE unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_random_int32(unsigned PY_LONG_LONG *__pyx_v_next_random) { + unsigned PY_LONG_LONG __pyx_v_this_random; + unsigned PY_LONG_LONG __pyx_r; + + /* "word2vec_inner_in_works.pyx":106 + * # note this function side-effects next_random to set up the next number + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: + * cdef unsigned long long this_random = next_random[0] >> 16 # <<<<<<<<<<<<<< + * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL + * return this_random + */ + __pyx_v_this_random = ((__pyx_v_next_random[0]) >> 16); + + /* "word2vec_inner_in_works.pyx":107 + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: + * 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); + + /* "word2vec_inner_in_works.pyx":108 + * 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; + goto __pyx_L0; + + /* "word2vec_inner_in_works.pyx":105 + * # this quick & dirty RNG apparently matches Java's (non-Secure)Random + * # note this function side-effects next_random to set up the next number + * cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: # <<<<<<<<<<<<<< + * cdef unsigned long long this_random = next_random[0] >> 16 + * next_random[0] = (next_random[0] * 25214903917ULL + 11) & 281474976710655ULL + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "word2vec_inner_in_works.pyx":110 + * 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, + */ + +static unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_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_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0, __pyx_t_23word2vec_inner_in_works_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_word2_index, __pyx_t_23word2vec_inner_in_works_REAL_t const __pyx_v_alpha, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work, unsigned PY_LONG_LONG __pyx_v_next_random, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + unsigned PY_LONG_LONG __pyx_v_modulo; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_f; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_g; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_label; + __pyx_t_5numpy_uint32_t __pyx_v_target_index; + int __pyx_v_d; + unsigned PY_LONG_LONG __pyx_r; + long __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + + /* "word2vec_inner_in_works.pyx":117 + * + * cdef long long a + * cdef long long row1 = word2_index * size, row2 # <<<<<<<<<<<<<< + * cdef unsigned long long modulo = 281474976710655ULL + * cdef REAL_t f, g, label + */ + __pyx_v_row1 = (__pyx_v_word2_index * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":118 + * cdef long long a + * cdef long long row1 = word2_index * size, row2 + * cdef unsigned long long modulo = 281474976710655ULL # <<<<<<<<<<<<<< + * cdef REAL_t f, g, label + * cdef np.uint32_t target_index + */ + __pyx_v_modulo = 281474976710655ULL; + + /* "word2vec_inner_in_works.pyx":123 + * 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_23word2vec_inner_in_works_REAL_t)))); + + /* "word2vec_inner_in_works.pyx":125 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * + * for d in range(negative+1): # <<<<<<<<<<<<<< + * if d == 0: + * target_index = word_index + */ + __pyx_t_1 = (__pyx_v_negative + 1); + for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_d = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":126 + * + * 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) { + + /* "word2vec_inner_in_works.pyx":127 + * for d in range(negative+1): + * if d == 0: + * target_index = word_index # <<<<<<<<<<<<<< + * label = ONEF + * else: + */ + __pyx_v_target_index = __pyx_v_word_index; + + /* "word2vec_inner_in_works.pyx":128 + * 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_23word2vec_inner_in_works_ONEF; + + /* "word2vec_inner_in_works.pyx":126 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + goto __pyx_L5; + } + + /* "word2vec_inner_in_works.pyx":130 + * 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_23word2vec_inner_in_works_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); + + /* "word2vec_inner_in_works.pyx":131 + * 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); + + /* "word2vec_inner_in_works.pyx":132 + * 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) { + + /* "word2vec_inner_in_works.pyx":133 + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + * continue # <<<<<<<<<<<<<< + * label = 0.0 + * + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":132 + * 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 + */ + } + + /* "word2vec_inner_in_works.pyx":134 + * if target_index == word_index: + * continue + * label = 0.0 # <<<<<<<<<<<<<< + * + * row2 = target_index * size + */ + __pyx_v_label = ((__pyx_t_23word2vec_inner_in_works_REAL_t)0.0); + } + __pyx_L5:; + + /* "word2vec_inner_in_works.pyx":136 + * label = 0.0 + * + * row2 = target_index * size # <<<<<<<<<<<<<< + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":137 + * + * row2 = target_index * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_23word2vec_inner_in_works_our_dot((&__pyx_v_size), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":138 + * row2 = target_index * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L8_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L8_bool_binop_done:; + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":139 + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":138 + * row2 = target_index * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "word2vec_inner_in_works.pyx":140 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_23word2vec_inner_in_works_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "word2vec_inner_in_works.pyx":141 + * continue + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + */ + __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); + + /* "word2vec_inner_in_works.pyx":142 + * f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + * + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":143 + * g = (label - f) * alpha + * 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_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + __pyx_L3_continue:; + } + + /* "word2vec_inner_in_works.pyx":145 + * 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_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[__pyx_v_word2_index])), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":147 + * our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) + * + * return next_random # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_next_random; + goto __pyx_L0; + + /* "word2vec_inner_in_works.pyx":110 + * 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, + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "word2vec_inner_in_works.pyx":150 + * + * + * 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, + */ + +static void __pyx_f_23word2vec_inner_in_works_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_23word2vec_inner_in_works_REAL_t *__pyx_v_neu1, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_23word2vec_inner_in_works_REAL_t const __pyx_v_alpha, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work, int __pyx_v_i, int __pyx_v_j, int __pyx_v_k, int __pyx_v_cbow_mean, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_f; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_g; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_count; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_inv_count; + int __pyx_v_m; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PY_LONG_LONG __pyx_t_4; + int __pyx_t_5; + + /* "word2vec_inner_in_works.pyx":158 + * cdef long long a, b + * cdef long long row2 + * cdef REAL_t f, g, count, inv_count = 1.0 # <<<<<<<<<<<<<< + * cdef int m + * + */ + __pyx_v_inv_count = 1.0; + + /* "word2vec_inner_in_works.pyx":161 + * 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_23word2vec_inner_in_works_REAL_t)))); + + /* "word2vec_inner_in_works.pyx":162 + * + * 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_23word2vec_inner_in_works_REAL_t)0.0); + + /* "word2vec_inner_in_works.pyx":163 + * 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; + + /* "word2vec_inner_in_works.pyx":164 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":165 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * count += ONEF + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":164 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "word2vec_inner_in_works.pyx":167 + * continue + * else: + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + */ + /*else*/ { + __pyx_v_count = (__pyx_v_count + __pyx_v_23word2vec_inner_in_works_ONEF); + + /* "word2vec_inner_in_works.pyx":168 + * else: + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * if count > (0.5): + * inv_count = ONEF/count + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_23word2vec_inner_in_works_ONEF), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE)); + } + __pyx_L3_continue:; + } + + /* "word2vec_inner_in_works.pyx":169 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + __pyx_t_3 = ((__pyx_v_count > ((__pyx_t_23word2vec_inner_in_works_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":170 + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + * inv_count = ONEF/count # <<<<<<<<<<<<<< + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + */ + __pyx_v_inv_count = (__pyx_v_23word2vec_inner_in_works_ONEF / __pyx_v_count); + + /* "word2vec_inner_in_works.pyx":169 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + } + + /* "word2vec_inner_in_works.pyx":171 + * if count > (0.5): + * 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) { + + /* "word2vec_inner_in_works.pyx":172 + * 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_23word2vec_inner_in_works_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":171 + * if count > (0.5): + * inv_count = ONEF/count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + * + */ + } + + /* "word2vec_inner_in_works.pyx":174 + * 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 + */ + memset(__pyx_v_work, 0, (__pyx_v_size * (sizeof(__pyx_t_23word2vec_inner_in_works_REAL_t)))); + + /* "word2vec_inner_in_works.pyx":175 + * + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelens[i]): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + */ + __pyx_t_1 = (__pyx_v_codelens[__pyx_v_i]); + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) { + __pyx_v_b = __pyx_t_4; + + /* "word2vec_inner_in_works.pyx":176 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * for b in range(codelens[i]): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":177 + * for b in range(codelens[i]): + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_23word2vec_inner_in_works_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":178 + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_5 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L11_bool_binop_done; + } + __pyx_t_5 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_5; + __pyx_L11_bool_binop_done:; + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":179 + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (1 - word_code[b] - f) * alpha + */ + goto __pyx_L8_continue; + + /* "word2vec_inner_in_works.pyx":178 + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "word2vec_inner_in_works.pyx":180 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_f = (__pyx_v_23word2vec_inner_in_works_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "word2vec_inner_in_works.pyx":181 + * continue + * f = EXP_TABLE[((f + 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) + */ + __pyx_v_g = (((1 - (__pyx_v_word_code[__pyx_v_b])) - __pyx_v_f) * __pyx_v_alpha); + + /* "word2vec_inner_in_works.pyx":182 + * f = EXP_TABLE[((f + 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) + * + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":183 + * 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 + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + __pyx_L8_continue:; + } + + /* "word2vec_inner_in_works.pyx":185 + * 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) { + + /* "word2vec_inner_in_works.pyx":186 + * + * 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_23word2vec_inner_in_works_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":185 + * 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?) + * + */ + } + + /* "word2vec_inner_in_works.pyx":188 + * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) + * + * 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; + + /* "word2vec_inner_in_works.pyx":189 + * + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":190 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m] * size], &ONE) + */ + goto __pyx_L14_continue; + + /* "word2vec_inner_in_works.pyx":189 + * + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "word2vec_inner_in_works.pyx":192 + * continue + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m] * size], &ONE) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + } + __pyx_L14_continue:; + } + + /* "word2vec_inner_in_works.pyx":150 + * + * + * 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, + */ + + /* function exit code */ +} + +/* "word2vec_inner_in_works.pyx":195 + * + * + * 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, + */ + +static unsigned PY_LONG_LONG __pyx_f_23word2vec_inner_in_works_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_23word2vec_inner_in_works_REAL_t *__pyx_v_neu1, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn1neg, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_23word2vec_inner_in_works_REAL_t const __pyx_v_alpha, __pyx_t_23word2vec_inner_in_works_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_23word2vec_inner_in_works_REAL_t *__pyx_v_word_locks) { + PY_LONG_LONG __pyx_v_row2; + unsigned PY_LONG_LONG __pyx_v_modulo; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_f; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_g; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_count; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_inv_count; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_label; + __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; + long __pyx_t_4; + int __pyx_t_5; + + /* "word2vec_inner_in_works.pyx":203 + * 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 + * cdef np.uint32_t target_index, word_index + */ + __pyx_v_modulo = 281474976710655ULL; + + /* "word2vec_inner_in_works.pyx":204 + * cdef long long row2 + * cdef unsigned long long modulo = 281474976710655ULL + * cdef REAL_t f, g, count, inv_count = 1.0, label # <<<<<<<<<<<<<< + * cdef np.uint32_t target_index, word_index + * cdef int d, m + */ + __pyx_v_inv_count = 1.0; + + /* "word2vec_inner_in_works.pyx":208 + * 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]); + + /* "word2vec_inner_in_works.pyx":210 + * 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_23word2vec_inner_in_works_REAL_t)))); + + /* "word2vec_inner_in_works.pyx":211 + * + * 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_23word2vec_inner_in_works_REAL_t)0.0); + + /* "word2vec_inner_in_works.pyx":212 + * 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; + + /* "word2vec_inner_in_works.pyx":213 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":214 + * for m in range(j, k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * count += ONEF + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":213 + * count = 0.0 + * for m in range(j, k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "word2vec_inner_in_works.pyx":216 + * continue + * else: + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + */ + /*else*/ { + __pyx_v_count = (__pyx_v_count + __pyx_v_23word2vec_inner_in_works_ONEF); + + /* "word2vec_inner_in_works.pyx":217 + * else: + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * if count > (0.5): + * inv_count = ONEF/count + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_23word2vec_inner_in_works_ONEF), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE)); + } + __pyx_L3_continue:; + } + + /* "word2vec_inner_in_works.pyx":218 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + __pyx_t_3 = ((__pyx_v_count > ((__pyx_t_23word2vec_inner_in_works_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":219 + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + * inv_count = ONEF/count # <<<<<<<<<<<<<< + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + */ + __pyx_v_inv_count = (__pyx_v_23word2vec_inner_in_works_ONEF / __pyx_v_count); + + /* "word2vec_inner_in_works.pyx":218 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + } + + /* "word2vec_inner_in_works.pyx":220 + * if count > (0.5): + * 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) { + + /* "word2vec_inner_in_works.pyx":221 + * 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_23word2vec_inner_in_works_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":220 + * if count > (0.5): + * inv_count = ONEF/count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) # (does this need BLAS-variants like saxpy?) + * + */ + } + + /* "word2vec_inner_in_works.pyx":223 + * 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_23word2vec_inner_in_works_REAL_t)))); + + /* "word2vec_inner_in_works.pyx":225 + * memset(work, 0, size * cython.sizeof(REAL_t)) + * + * for d in range(negative+1): # <<<<<<<<<<<<<< + * if d == 0: + * target_index = word_index + */ + __pyx_t_4 = (__pyx_v_negative + 1); + for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { + __pyx_v_d = __pyx_t_1; + + /* "word2vec_inner_in_works.pyx":226 + * + * 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) { + + /* "word2vec_inner_in_works.pyx":227 + * for d in range(negative+1): + * if d == 0: + * target_index = word_index # <<<<<<<<<<<<<< + * label = ONEF + * else: + */ + __pyx_v_target_index = __pyx_v_word_index; + + /* "word2vec_inner_in_works.pyx":228 + * 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_23word2vec_inner_in_works_ONEF; + + /* "word2vec_inner_in_works.pyx":226 + * + * for d in range(negative+1): + * if d == 0: # <<<<<<<<<<<<<< + * target_index = word_index + * label = ONEF + */ + goto __pyx_L10; + } + + /* "word2vec_inner_in_works.pyx":230 + * 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_23word2vec_inner_in_works_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); + + /* "word2vec_inner_in_works.pyx":231 + * 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); + + /* "word2vec_inner_in_works.pyx":232 + * 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) { + + /* "word2vec_inner_in_works.pyx":233 + * next_random = (next_random * 25214903917ULL + 11) & modulo + * if target_index == word_index: + * continue # <<<<<<<<<<<<<< + * label = 0.0 + * + */ + goto __pyx_L8_continue; + + /* "word2vec_inner_in_works.pyx":232 + * 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 + */ + } + + /* "word2vec_inner_in_works.pyx":234 + * if target_index == word_index: + * continue + * label = 0.0 # <<<<<<<<<<<<<< + * + * row2 = target_index * size + */ + __pyx_v_label = ((__pyx_t_23word2vec_inner_in_works_REAL_t)0.0); + } + __pyx_L10:; + + /* "word2vec_inner_in_works.pyx":236 + * label = 0.0 + * + * row2 = target_index * size # <<<<<<<<<<<<<< + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_row2 = (__pyx_v_target_index * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":237 + * + * row2 = target_index * size + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = __pyx_v_23word2vec_inner_in_works_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":238 + * row2 = target_index * size + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_5 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_5 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_5; + __pyx_L13_bool_binop_done:; + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":239 + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * g = (label - f) * alpha + */ + goto __pyx_L8_continue; + + /* "word2vec_inner_in_works.pyx":238 + * row2 = target_index * size + * f = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = EXP_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "word2vec_inner_in_works.pyx":240 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = EXP_TABLE[((f + 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_23word2vec_inner_in_works_EXP_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "word2vec_inner_in_works.pyx":241 + * continue + * f = EXP_TABLE[((f + 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) + */ + __pyx_v_g = ((__pyx_v_label - __pyx_v_f) * __pyx_v_alpha); + + /* "word2vec_inner_in_works.pyx":242 + * f = EXP_TABLE[((f + 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) + * + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":243 + * 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 + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_g), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1neg[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + __pyx_L8_continue:; + } + + /* "word2vec_inner_in_works.pyx":245 + * 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) { + + /* "word2vec_inner_in_works.pyx":246 + * + * 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_23word2vec_inner_in_works_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":245 + * 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?) + * + */ + } + + /* "word2vec_inner_in_works.pyx":248 + * sscal(&size, &inv_count, work, &ONE) # (does this need BLAS-variants like saxpy?) + * + * 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; + + /* "word2vec_inner_in_works.pyx":249 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_3 = ((__pyx_v_m == __pyx_v_i) != 0); + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":250 + * for m in range(j,k): + * if m == i: + * continue # <<<<<<<<<<<<<< + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) + */ + goto __pyx_L16_continue; + + /* "word2vec_inner_in_works.pyx":249 + * + * for m in range(j,k): + * if m == i: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "word2vec_inner_in_works.pyx":252 + * continue + * else: + * our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) # <<<<<<<<<<<<<< + * + * return next_random + */ + /*else*/ { + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&(__pyx_v_word_locks[(__pyx_v_indexes[__pyx_v_m])])), __pyx_v_work, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + } + __pyx_L16_continue:; + } + + /* "word2vec_inner_in_works.pyx":254 + * 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; + + /* "word2vec_inner_in_works.pyx":195 + * + * + * 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, + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "word2vec_inner_in_works.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_23word2vec_inner_in_works_1train_batch_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_23word2vec_inner_in_works_1train_batch_sg = {"train_batch_sg", (PyCFunction)__pyx_pw_23word2vec_inner_in_works_1train_batch_sg, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_23word2vec_inner_in_works_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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 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,0}; + PyObject* values[4] = {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 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, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __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, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __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, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentences = values[1]; + __pyx_v_alpha = values[2]; + __pyx_v__work = values[3]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("train_batch_sg", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("word2vec_inner_in_works.train_batch_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_23word2vec_inner_in_works_train_batch_sg(__pyx_self, __pyx_v_model, __pyx_v_sentences, __pyx_v_alpha, __pyx_v__work); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_23word2vec_inner_in_works_train_batch_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentences, PyObject *__pyx_v_alpha, PyObject *__pyx_v__work) { + int __pyx_v_hs; + int __pyx_v_negative; + int __pyx_v_sample; + int __pyx_v_sc; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_word_locks; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work; + __pyx_t_23word2vec_inner_in_works_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_23word2vec_inner_in_works_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_23word2vec_inner_in_works_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; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_sent = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + PyObject *__pyx_v_item = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __pyx_t_23word2vec_inner_in_works_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; + Py_ssize_t __pyx_t_16; + PyObject *__pyx_t_17 = NULL; + int __pyx_t_18; + int __pyx_t_19; + int __pyx_t_20; + int __pyx_t_21; + int __pyx_t_22; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("train_batch_sg", 0); + + /* "word2vec_inner_in_works.pyx":258 + * + * def train_batch_sg(model, sentences, alpha, _work): + * 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_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_hs = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":259 + * def train_batch_sg(model, sentences, alpha, _work): + * cdef int hs = model.hs + * cdef int negative = model.negative # <<<<<<<<<<<<<< + * cdef int sample = (model.sample != 0) + * cdef int sc = model.synt_cont + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_negative); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_negative = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":260 + * cdef int hs = model.hs + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) # <<<<<<<<<<<<<< + * cdef int sc = model.synt_cont + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_sample); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sample = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":261 + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) + * cdef int sc = model.synt_cont # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_synt_cont); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sc = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":263 + * cdef int sc = model.synt_cont + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * cdef REAL_t *work + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":264 + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef REAL_t _alpha = alpha + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_lockf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_word_locks = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":266 + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * 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_filename = __pyx_f[0]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v__alpha = __pyx_t_4; + + /* "word2vec_inner_in_works.pyx":267 + * 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_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_size = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":273 + * 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_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_window = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":276 + * + * 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; + + /* "word2vec_inner_in_works.pyx":291 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":292 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":291 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + } + + /* "word2vec_inner_in_works.pyx":294 + * 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) { + + /* "word2vec_inner_in_works.pyx":295 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1neg = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.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) + * if negative or sample: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cum_table); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __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; + + /* "word2vec_inner_in_works.pyx":297 + * 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_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cum_table_len = __pyx_t_6; + + /* "word2vec_inner_in_works.pyx":294 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + } + + /* "word2vec_inner_in_works.pyx":298 + * 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) { + + /* "word2vec_inner_in_works.pyx":299 + * 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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_next_random = __pyx_t_9; + + /* "word2vec_inner_in_works.pyx":298 + * 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) + * + */ + } + + /* "word2vec_inner_in_works.pyx":302 + * + * # 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_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "word2vec_inner_in_works.pyx":305 + * + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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_vocab); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_vlookup = __pyx_t_8; + __pyx_t_8 = 0; + + /* "word2vec_inner_in_works.pyx":306 + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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; + + /* "word2vec_inner_in_works.pyx":307 + * vlookup = model.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_8 = __pyx_v_sentences; __Pyx_INCREF(__pyx_t_8); __pyx_t_6 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_sentences); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_8))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_10(__pyx_t_8); + 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_filename = __pyx_f[0]; __pyx_lineno = 307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_sent, __pyx_t_3); + __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":308 + * 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_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = ((!__pyx_t_5) != 0); + if (__pyx_t_7) { + + /* "word2vec_inner_in_works.pyx":309 + * 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; + + /* "word2vec_inner_in_works.pyx":308 + * 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: + */ + } + + /* "word2vec_inner_in_works.pyx":310 + * 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_3 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_3); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + } else { + __pyx_t_11 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_12 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_12)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_12(__pyx_t_3); + 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_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_1); + __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":311 + * 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_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_7 != 0)) { + __pyx_t_13 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_13 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __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; + + /* "word2vec_inner_in_works.pyx":312 + * 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) { + + /* "word2vec_inner_in_works.pyx":313 + * 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; + + /* "word2vec_inner_in_works.pyx":312 + * 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): + */ + } + + /* "word2vec_inner_in_works.pyx":314 + * 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_filename = __pyx_f[0]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = __Pyx_PyInt_From_unsigned_PY_LONG_LONG(__pyx_f_23word2vec_inner_in_works_random_int32((&__pyx_v_next_random))); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __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) { + + /* "word2vec_inner_in_works.pyx":315 + * 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 + * if hs: + */ + goto __pyx_L11_continue; + + /* "word2vec_inner_in_works.pyx":314 + * 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 + */ + } + + /* "word2vec_inner_in_works.pyx":316 + * if sample and word.sample_int < random_int32(&next_random): + * continue + * indexes[effective_words] = word.index # <<<<<<<<<<<<<< + * if hs: + * codelens[effective_words] = len(word.code) + */ + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_indexes[__pyx_v_effective_words]) = __pyx_t_15; + + /* "word2vec_inner_in_works.pyx":317 + * continue + * indexes[effective_words] = word.index + * 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) { + + /* "word2vec_inner_in_works.pyx":318 + * indexes[effective_words] = word.index + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_16 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_codelens[__pyx_v_effective_words]) = ((int)__pyx_t_16); + + /* "word2vec_inner_in_works.pyx":319 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "word2vec_inner_in_works.pyx":320 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "word2vec_inner_in_works.pyx":317 + * continue + * indexes[effective_words] = word.index + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + } + + /* "word2vec_inner_in_works.pyx":321 + * 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 # TODO: log warning, tally overflow? + */ + __pyx_v_effective_words = (__pyx_v_effective_words + 1); + + /* "word2vec_inner_in_works.pyx":322 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + __pyx_t_5 = ((__pyx_v_effective_words == 0x2710) != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":323 + * 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; + + /* "word2vec_inner_in_works.pyx":322 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + } + + /* "word2vec_inner_in_works.pyx":310 + * 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_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":328 + * # across sentence boundaries. + * # indices of sentence number X are between tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_14))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_10(__pyx_t_14); + 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_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_i = __pyx_t_2; + __pyx_t_2 = (__pyx_t_2 + 1); + + /* "word2vec_inner_in_works.pyx":336 + * # 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_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_reduced_windows[__pyx_v_i]) = __pyx_t_15; + + /* "word2vec_inner_in_works.pyx":335 + * + * # 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_14); __pyx_t_14 = 0; + + /* "word2vec_inner_in_works.pyx":339 + * + * # 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:*/ { + + /* "word2vec_inner_in_works.pyx":340 + * # 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_18 = 0; __pyx_t_18 < __pyx_t_2; __pyx_t_18+=1) { + __pyx_v_sent_idx = __pyx_t_18; + + /* "word2vec_inner_in_works.pyx":341 + * with nogil: + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] # <<<<<<<<<<<<<< + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: + */ + __pyx_v_idx_start = (__pyx_v_sentence_idx[__pyx_v_sent_idx]); + + /* "word2vec_inner_in_works.pyx":342 + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] # <<<<<<<<<<<<<< + * if not sc: + * for i in range(idx_start, idx_end): + */ + __pyx_v_idx_end = (__pyx_v_sentence_idx[(__pyx_v_sent_idx + 1)]); + + /* "word2vec_inner_in_works.pyx":343 + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: # <<<<<<<<<<<<<< + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + */ + __pyx_t_5 = ((!(__pyx_v_sc != 0)) != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":344 + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: + * for i in range(idx_start, idx_end): # <<<<<<<<<<<<<< + * j = i - window + reduced_windows[i] + * if j < idx_start: + */ + __pyx_t_19 = __pyx_v_idx_end; + for (__pyx_t_20 = __pyx_v_idx_start; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) { + __pyx_v_i = __pyx_t_20; + + /* "word2vec_inner_in_works.pyx":345 + * if not sc: + * 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])); + + /* "word2vec_inner_in_works.pyx":346 + * 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) { + + /* "word2vec_inner_in_works.pyx":347 + * 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; + + /* "word2vec_inner_in_works.pyx":346 + * 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] + */ + } + + /* "word2vec_inner_in_works.pyx":348 + * 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])); + + /* "word2vec_inner_in_works.pyx":349 + * 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) { + + /* "word2vec_inner_in_works.pyx":350 + * 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; + + /* "word2vec_inner_in_works.pyx":349 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * for j in range(j, k): + */ + } + + /* "word2vec_inner_in_works.pyx":351 + * if k > idx_end: + * k = idx_end + * for j in range(j, k): # <<<<<<<<<<<<<< + * if j == i: + * continue + */ + __pyx_t_21 = __pyx_v_k; + for (__pyx_t_22 = __pyx_v_j; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) { + __pyx_v_j = __pyx_t_22; + + /* "word2vec_inner_in_works.pyx":352 + * 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) { + + /* "word2vec_inner_in_works.pyx":353 + * for j in range(j, k): + * if j == i: + * continue # <<<<<<<<<<<<<< + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + */ + goto __pyx_L32_continue; + + /* "word2vec_inner_in_works.pyx":352 + * k = idx_end + * for j in range(j, k): + * if j == i: # <<<<<<<<<<<<<< + * continue + * if hs: + */ + } + + /* "word2vec_inner_in_works.pyx":354 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":355 + * continue + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) # <<<<<<<<<<<<<< + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + */ + __pyx_f_23word2vec_inner_in_works_fast_sentence_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__alpha, __pyx_v_work, __pyx_v_word_locks); + + /* "word2vec_inner_in_works.pyx":354 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + */ + } + + /* "word2vec_inner_in_works.pyx":356 + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * if sc: + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":357 + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) # <<<<<<<<<<<<<< + * if sc: + * i = idx_start + */ + __pyx_v_next_random = __pyx_f_23word2vec_inner_in_works_fast_sentence_sg_neg(__pyx_v_negative, __pyx_v_cum_table, __pyx_v_cum_table_len, __pyx_v_syn0, __pyx_v_syn1neg, __pyx_v_size, (__pyx_v_indexes[__pyx_v_i]), (__pyx_v_indexes[__pyx_v_j]), __pyx_v__alpha, __pyx_v_work, __pyx_v_next_random, __pyx_v_word_locks); + + /* "word2vec_inner_in_works.pyx":356 + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * if sc: + */ + } + __pyx_L32_continue:; + } + } + + /* "word2vec_inner_in_works.pyx":343 + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: # <<<<<<<<<<<<<< + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + */ + } + + /* "word2vec_inner_in_works.pyx":358 + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * if sc: # <<<<<<<<<<<<<< + * i = idx_start + * j = idx_start + */ + __pyx_t_5 = (__pyx_v_sc != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":359 + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * if sc: + * i = idx_start # <<<<<<<<<<<<<< + * j = idx_start + * k = idx_end + */ + __pyx_v_i = __pyx_v_idx_start; + + /* "word2vec_inner_in_works.pyx":360 + * if sc: + * i = idx_start + * j = idx_start # <<<<<<<<<<<<<< + * k = idx_end + * for j in range(j, k): + */ + __pyx_v_j = __pyx_v_idx_start; + + /* "word2vec_inner_in_works.pyx":361 + * i = idx_start + * j = idx_start + * k = idx_end # <<<<<<<<<<<<<< + * for j in range(j, k): + * if j == i: + */ + __pyx_v_k = __pyx_v_idx_end; + + /* "word2vec_inner_in_works.pyx":362 + * j = idx_start + * k = idx_end + * for j in range(j, k): # <<<<<<<<<<<<<< + * if j == i: + * continue + */ + __pyx_t_19 = __pyx_v_k; + for (__pyx_t_20 = __pyx_v_j; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) { + __pyx_v_j = __pyx_t_20; + + /* "word2vec_inner_in_works.pyx":363 + * 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) { + + /* "word2vec_inner_in_works.pyx":364 + * for j in range(j, k): + * if j == i: + * continue # <<<<<<<<<<<<<< + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + */ + goto __pyx_L38_continue; + + /* "word2vec_inner_in_works.pyx":363 + * k = idx_end + * for j in range(j, k): + * if j == i: # <<<<<<<<<<<<<< + * continue + * if hs: + */ + } + + /* "word2vec_inner_in_works.pyx":365 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":366 + * continue + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) # <<<<<<<<<<<<<< + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + */ + __pyx_f_23word2vec_inner_in_works_fast_sentence_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__alpha, __pyx_v_work, __pyx_v_word_locks); + + /* "word2vec_inner_in_works.pyx":365 + * if j == i: + * continue + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + */ + } + + /* "word2vec_inner_in_works.pyx":367 + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":368 + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) # <<<<<<<<<<<<<< + * + * return effective_words + */ + __pyx_v_next_random = __pyx_f_23word2vec_inner_in_works_fast_sentence_sg_neg(__pyx_v_negative, __pyx_v_cum_table, __pyx_v_cum_table_len, __pyx_v_syn0, __pyx_v_syn1neg, __pyx_v_size, (__pyx_v_indexes[__pyx_v_i]), (__pyx_v_indexes[__pyx_v_j]), __pyx_v__alpha, __pyx_v_work, __pyx_v_next_random, __pyx_v_word_locks); + + /* "word2vec_inner_in_works.pyx":367 + * if hs: + * fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * + */ + } + __pyx_L38_continue:; + } + + /* "word2vec_inner_in_works.pyx":358 + * if negative: + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * if sc: # <<<<<<<<<<<<<< + * i = idx_start + * j = idx_start + */ + } + } + } + + /* "word2vec_inner_in_works.pyx":339 + * + * # 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_L24; + } + __pyx_L24:; + } + } + + /* "word2vec_inner_in_works.pyx":370 + * next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + * + * return effective_words # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_r = __pyx_t_14; + __pyx_t_14 = 0; + goto __pyx_L0; + + /* "word2vec_inner_in_works.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * 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_17); + __Pyx_AddTraceback("word2vec_inner_in_works.train_batch_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_sent); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "word2vec_inner_in_works.pyx":373 + * + * + * 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_23word2vec_inner_in_works_3train_batch_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_23word2vec_inner_in_works_3train_batch_cbow = {"train_batch_cbow", (PyCFunction)__pyx_pw_23word2vec_inner_in_works_3train_batch_cbow, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_23word2vec_inner_in_works_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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 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_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("word2vec_inner_in_works.train_batch_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_23word2vec_inner_in_works_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_23word2vec_inner_in_works_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; + int __pyx_v_sc; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_word_locks; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work; + __pyx_t_23word2vec_inner_in_works_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_23word2vec_inner_in_works_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_23word2vec_inner_in_works_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; + __pyx_t_23word2vec_inner_in_works_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_item = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __pyx_t_23word2vec_inner_in_works_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; + Py_ssize_t __pyx_t_16; + PyObject *__pyx_t_17 = NULL; + int __pyx_t_18; + int __pyx_t_19; + int __pyx_t_20; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("train_batch_cbow", 0); + + /* "word2vec_inner_in_works.pyx":374 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_hs = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":375 + * 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_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_negative = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":376 + * cdef int hs = model.hs + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) # <<<<<<<<<<<<<< + * cdef int cbow_mean = model.cbow_mean + * cdef int sc = model.synt_cont + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_sample); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sample = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":377 + * cdef int negative = model.negative + * cdef int sample = (model.sample != 0) + * cdef int cbow_mean = model.cbow_mean # <<<<<<<<<<<<<< + * cdef int sc = model.synt_cont + * + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cbow_mean); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cbow_mean = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":378 + * cdef int sample = (model.sample != 0) + * cdef int cbow_mean = model.cbow_mean + * cdef int sc = model.synt_cont # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_synt_cont); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sc = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":380 + * cdef int sc = model.synt_cont + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * cdef REAL_t *work + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":381 + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef REAL_t _alpha = alpha + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0_lockf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_word_locks = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":383 + * cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_lockf)) + * 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_filename = __pyx_f[0]; __pyx_lineno = 383; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v__alpha = __pyx_t_4; + + /* "word2vec_inner_in_works.pyx":384 + * 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_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_size = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":390 + * 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_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_window = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":393 + * + * 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; + + /* "word2vec_inner_in_works.pyx":408 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":409 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":408 + * cdef unsigned long long next_random + * + * if hs: # <<<<<<<<<<<<<< + * syn1 = (np.PyArray_DATA(model.syn1)) + * + */ + } + + /* "word2vec_inner_in_works.pyx":411 + * 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) { + + /* "word2vec_inner_in_works.pyx":412 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1neg = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_3))); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":413 + * 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_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __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; + + /* "word2vec_inner_in_works.pyx":414 + * 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_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_cum_table_len = __pyx_t_6; + + /* "word2vec_inner_in_works.pyx":411 + * syn1 = (np.PyArray_DATA(model.syn1)) + * + * if negative: # <<<<<<<<<<<<<< + * syn1neg = (np.PyArray_DATA(model.syn1neg)) + * cum_table = (np.PyArray_DATA(model.cum_table)) + */ + } + + /* "word2vec_inner_in_works.pyx":415 + * 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) { + + /* "word2vec_inner_in_works.pyx":416 + * 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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_next_random = __pyx_t_9; + + /* "word2vec_inner_in_works.pyx":415 + * 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) + * + */ + } + + /* "word2vec_inner_in_works.pyx":419 + * + * # 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_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "word2vec_inner_in_works.pyx":420 + * # 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_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_neu1 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__neu1))); + + /* "word2vec_inner_in_works.pyx":423 + * + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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_vocab); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_v_vlookup = __pyx_t_8; + __pyx_t_8 = 0; + + /* "word2vec_inner_in_works.pyx":424 + * # prepare C structures so we can go "full C" and release the Python GIL + * vlookup = model.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; + + /* "word2vec_inner_in_works.pyx":425 + * vlookup = model.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_8 = __pyx_v_sentences; __Pyx_INCREF(__pyx_t_8); __pyx_t_6 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_6 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_sentences); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_10 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_8))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_8, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + } + } else { + __pyx_t_3 = __pyx_t_10(__pyx_t_8); + 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_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_sent, __pyx_t_3); + __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":426 + * 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_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = ((!__pyx_t_5) != 0); + if (__pyx_t_7) { + + /* "word2vec_inner_in_works.pyx":427 + * 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; + + /* "word2vec_inner_in_works.pyx":426 + * 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: + */ + } + + /* "word2vec_inner_in_works.pyx":428 + * 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_3 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_3); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + } else { + __pyx_t_11 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_12 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_12)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_11 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + if (__pyx_t_11 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_12(__pyx_t_3); + 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_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_1); + __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":429 + * 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_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_7 != 0)) { + __pyx_t_13 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_13 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __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; + + /* "word2vec_inner_in_works.pyx":430 + * 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) { + + /* "word2vec_inner_in_works.pyx":431 + * 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; + + /* "word2vec_inner_in_works.pyx":430 + * 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): + */ + } + + /* "word2vec_inner_in_works.pyx":432 + * 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_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = __Pyx_PyInt_From_unsigned_PY_LONG_LONG(__pyx_f_23word2vec_inner_in_works_random_int32((&__pyx_v_next_random))); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __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) { + + /* "word2vec_inner_in_works.pyx":433 + * 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 + * if hs: + */ + goto __pyx_L11_continue; + + /* "word2vec_inner_in_works.pyx":432 + * 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 + */ + } + + /* "word2vec_inner_in_works.pyx":434 + * if sample and word.sample_int < random_int32(&next_random): + * continue + * indexes[effective_words] = word.index # <<<<<<<<<<<<<< + * if hs: + * codelens[effective_words] = len(word.code) + */ + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_indexes[__pyx_v_effective_words]) = __pyx_t_15; + + /* "word2vec_inner_in_works.pyx":435 + * continue + * indexes[effective_words] = word.index + * 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) { + + /* "word2vec_inner_in_works.pyx":436 + * indexes[effective_words] = word.index + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_t_16 = PyObject_Length(__pyx_t_14); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + (__pyx_v_codelens[__pyx_v_effective_words]) = ((int)__pyx_t_16); + + /* "word2vec_inner_in_works.pyx":437 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "word2vec_inner_in_works.pyx":438 + * 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_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + if (!(likely(((__pyx_t_14) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_14, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_effective_words]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_14))); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + + /* "word2vec_inner_in_works.pyx":435 + * continue + * indexes[effective_words] = word.index + * if hs: # <<<<<<<<<<<<<< + * codelens[effective_words] = len(word.code) + * codes[effective_words] = np.PyArray_DATA(word.code) + */ + } + + /* "word2vec_inner_in_works.pyx":439 + * 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 # TODO: log warning, tally overflow? + */ + __pyx_v_effective_words = (__pyx_v_effective_words + 1); + + /* "word2vec_inner_in_works.pyx":440 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + __pyx_t_5 = ((__pyx_v_effective_words == 0x2710) != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":441 + * 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; + + /* "word2vec_inner_in_works.pyx":440 + * points[effective_words] = np.PyArray_DATA(word.point) + * effective_words += 1 + * if effective_words == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * + */ + } + + /* "word2vec_inner_in_works.pyx":428 + * 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_3); __pyx_t_3 = 0; + + /* "word2vec_inner_in_works.pyx":446 + * # across sentence boundaries. + * # indices of sentence number X are between tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + for (;;) { + if (likely(!__pyx_t_10)) { + if (likely(PyList_CheckExact(__pyx_t_14))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } else { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_14)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_8 = PySequence_ITEM(__pyx_t_14, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { + __pyx_t_8 = __pyx_t_10(__pyx_t_14); + 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_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_8); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_8); + __pyx_t_8 = 0; + __pyx_v_i = __pyx_t_2; + __pyx_t_2 = (__pyx_t_2 + 1); + + /* "word2vec_inner_in_works.pyx":454 + * # 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_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_reduced_windows[__pyx_v_i]) = __pyx_t_15; + + /* "word2vec_inner_in_works.pyx":453 + * + * # 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_14); __pyx_t_14 = 0; + + /* "word2vec_inner_in_works.pyx":457 + * + * # 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:*/ { + + /* "word2vec_inner_in_works.pyx":458 + * # 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_18 = 0; __pyx_t_18 < __pyx_t_2; __pyx_t_18+=1) { + __pyx_v_sent_idx = __pyx_t_18; + + /* "word2vec_inner_in_works.pyx":459 + * with nogil: + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] # <<<<<<<<<<<<<< + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: + */ + __pyx_v_idx_start = (__pyx_v_sentence_idx[__pyx_v_sent_idx]); + + /* "word2vec_inner_in_works.pyx":460 + * for sent_idx in range(effective_sentences): + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] # <<<<<<<<<<<<<< + * if not sc: + * for i in range(idx_start, idx_end): + */ + __pyx_v_idx_end = (__pyx_v_sentence_idx[(__pyx_v_sent_idx + 1)]); + + /* "word2vec_inner_in_works.pyx":461 + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: # <<<<<<<<<<<<<< + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + */ + __pyx_t_5 = ((!(__pyx_v_sc != 0)) != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":462 + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: + * for i in range(idx_start, idx_end): # <<<<<<<<<<<<<< + * j = i - window + reduced_windows[i] + * if j < idx_start: + */ + __pyx_t_19 = __pyx_v_idx_end; + for (__pyx_t_20 = __pyx_v_idx_start; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) { + __pyx_v_i = __pyx_t_20; + + /* "word2vec_inner_in_works.pyx":463 + * if not sc: + * 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])); + + /* "word2vec_inner_in_works.pyx":464 + * 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) { + + /* "word2vec_inner_in_works.pyx":465 + * 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; + + /* "word2vec_inner_in_works.pyx":464 + * 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] + */ + } + + /* "word2vec_inner_in_works.pyx":466 + * 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])); + + /* "word2vec_inner_in_works.pyx":467 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * if hs: + */ + __pyx_t_5 = ((__pyx_v_k > __pyx_v_idx_end) != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":468 + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: + * k = idx_end # <<<<<<<<<<<<<< + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + */ + __pyx_v_k = __pyx_v_idx_end; + + /* "word2vec_inner_in_works.pyx":467 + * j = idx_start + * k = i + window + 1 - reduced_windows[i] + * if k > idx_end: # <<<<<<<<<<<<<< + * k = idx_end + * if hs: + */ + } + + /* "word2vec_inner_in_works.pyx":469 + * if k > idx_end: + * k = idx_end + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":470 + * k = idx_end + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) # <<<<<<<<<<<<<< + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + */ + __pyx_f_23word2vec_inner_in_works_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, __pyx_v_syn1, __pyx_v_size, __pyx_v_indexes, __pyx_v__alpha, __pyx_v_work, __pyx_v_i, __pyx_v_j, __pyx_v_k, __pyx_v_cbow_mean, __pyx_v_word_locks); + + /* "word2vec_inner_in_works.pyx":469 + * if k > idx_end: + * k = idx_end + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + */ + } + + /* "word2vec_inner_in_works.pyx":471 + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * if sc: + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":472 + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) # <<<<<<<<<<<<<< + * if sc: + * i = idx_start + */ + __pyx_v_next_random = __pyx_f_23word2vec_inner_in_works_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, __pyx_v_syn1neg, __pyx_v_size, __pyx_v_indexes, __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); + + /* "word2vec_inner_in_works.pyx":471 + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * if sc: + */ + } + } + + /* "word2vec_inner_in_works.pyx":461 + * idx_start = sentence_idx[sent_idx] + * idx_end = sentence_idx[sent_idx + 1] + * if not sc: # <<<<<<<<<<<<<< + * for i in range(idx_start, idx_end): + * j = i - window + reduced_windows[i] + */ + } + + /* "word2vec_inner_in_works.pyx":473 + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * if sc: # <<<<<<<<<<<<<< + * i = idx_start + * j = idx_start + */ + __pyx_t_5 = (__pyx_v_sc != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":474 + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * if sc: + * i = idx_start # <<<<<<<<<<<<<< + * j = idx_start + * k = idx_end + */ + __pyx_v_i = __pyx_v_idx_start; + + /* "word2vec_inner_in_works.pyx":475 + * if sc: + * i = idx_start + * j = idx_start # <<<<<<<<<<<<<< + * k = idx_end + * if hs: + */ + __pyx_v_j = __pyx_v_idx_start; + + /* "word2vec_inner_in_works.pyx":476 + * i = idx_start + * j = idx_start + * k = idx_end # <<<<<<<<<<<<<< + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + */ + __pyx_v_k = __pyx_v_idx_end; + + /* "word2vec_inner_in_works.pyx":477 + * j = idx_start + * k = idx_end + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + */ + __pyx_t_5 = (__pyx_v_hs != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":478 + * k = idx_end + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) # <<<<<<<<<<<<<< + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + */ + __pyx_f_23word2vec_inner_in_works_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, __pyx_v_syn1, __pyx_v_size, __pyx_v_indexes, __pyx_v__alpha, __pyx_v_work, __pyx_v_i, __pyx_v_j, __pyx_v_k, __pyx_v_cbow_mean, __pyx_v_word_locks); + + /* "word2vec_inner_in_works.pyx":477 + * j = idx_start + * k = idx_end + * if hs: # <<<<<<<<<<<<<< + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + */ + } + + /* "word2vec_inner_in_works.pyx":479 + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * + */ + __pyx_t_5 = (__pyx_v_negative != 0); + if (__pyx_t_5) { + + /* "word2vec_inner_in_works.pyx":480 + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) # <<<<<<<<<<<<<< + * + * return effective_words + */ + __pyx_v_next_random = __pyx_f_23word2vec_inner_in_works_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, __pyx_v_syn1neg, __pyx_v_size, __pyx_v_indexes, __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); + + /* "word2vec_inner_in_works.pyx":479 + * if hs: + * fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + * if negative: # <<<<<<<<<<<<<< + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * + */ + } + + /* "word2vec_inner_in_works.pyx":473 + * if negative: + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * if sc: # <<<<<<<<<<<<<< + * i = idx_start + * j = idx_start + */ + } + } + } + + /* "word2vec_inner_in_works.pyx":457 + * + * # 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_L24; + } + __pyx_L24:; + } + } + + /* "word2vec_inner_in_works.pyx":482 + * next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + * + * return effective_words # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_14 = __Pyx_PyInt_From_int(__pyx_v_effective_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_14); + __pyx_r = __pyx_t_14; + __pyx_t_14 = 0; + goto __pyx_L0; + + /* "word2vec_inner_in_works.pyx":373 + * + * + * 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_17); + __Pyx_AddTraceback("word2vec_inner_in_works.train_batch_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_sent); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "word2vec_inner_in_works.pyx":486 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_23word2vec_inner_in_works_5score_sentence_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_23word2vec_inner_in_works_5score_sentence_sg = {"score_sentence_sg", (PyCFunction)__pyx_pw_23word2vec_inner_in_works_5score_sentence_sg, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_23word2vec_inner_in_works_5score_sentence_sg(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_model = 0; + PyObject *__pyx_v_sentence = 0; + PyObject *__pyx_v__work = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("score_sentence_sg (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_model,&__pyx_n_s_sentence,&__pyx_n_s_work,0}; + PyObject* values[3] = {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 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_sentence)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_sg", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_work)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_sg", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "score_sentence_sg") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentence = values[1]; + __pyx_v__work = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("score_sentence_sg", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("word2vec_inner_in_works.score_sentence_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_23word2vec_inner_in_works_4score_sentence_sg(__pyx_self, __pyx_v_model, __pyx_v_sentence, __pyx_v__work); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_23word2vec_inner_in_works_4score_sentence_sg(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work) { + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work; + int __pyx_v_size; + int __pyx_v_sc; + int __pyx_v_codelens[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_indexes[0x2710]; + int __pyx_v_sentence_len; + int __pyx_v_window; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + long __pyx_v_result; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn1; + __pyx_t_5numpy_uint32_t *__pyx_v_points[0x2710]; + __pyx_t_5numpy_uint8_t *__pyx_v_codes[0x2710]; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + __pyx_t_5numpy_uint32_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + int __pyx_t_12; + int __pyx_t_13; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("score_sentence_sg", 0); + + /* "word2vec_inner_in_works.pyx":488 + * def score_sentence_sg(model, sentence, _work): + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef int size = model.layer1_size + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":490 + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + * cdef REAL_t *work + * cdef int size = model.layer1_size # <<<<<<<<<<<<<< + * cdef int sc = model.synt_cont + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_layer1_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_size = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":491 + * cdef REAL_t *work + * cdef int size = model.layer1_size + * cdef int sc = model.synt_cont # <<<<<<<<<<<<<< + * + * cdef int codelens[MAX_SENTENCE_LEN] + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_synt_cont); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_sc = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":496 + * cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + * cdef int sentence_len + * 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_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_window = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":499 + * + * cdef int i, j, k + * cdef long result = 0 # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn1 + */ + __pyx_v_result = 0; + + /* "word2vec_inner_in_works.pyx":505 + * 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_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":508 + * + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) # <<<<<<<<<<<<<< + * + * vlookup = model.vocab + */ + if (!(likely(((__pyx_v__work) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__work, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "word2vec_inner_in_works.pyx":510 + * work = np.PyArray_DATA(_work) + * + * vlookup = model.vocab # <<<<<<<<<<<<<< + * i = 0 + * for token in sentence: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_vocab); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_vlookup = __pyx_t_1; + __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":511 + * + * vlookup = model.vocab + * i = 0 # <<<<<<<<<<<<<< + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + */ + __pyx_v_i = 0; + + /* "word2vec_inner_in_works.pyx":512 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + if (likely(PyList_CheckExact(__pyx_v_sentence)) || PyTuple_CheckExact(__pyx_v_sentence)) { + __pyx_t_1 = __pyx_v_sentence; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_1); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_5); + __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":513 + * i = 0 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None # <<<<<<<<<<<<<< + * if word is None: + * continue # should drop the + */ + __pyx_t_6 = (__Pyx_PySequence_ContainsTF(__pyx_v_token, __pyx_v_vlookup, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_6 != 0)) { + __pyx_t_7 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = __pyx_t_7; + __pyx_t_7 = 0; + } else { + __Pyx_INCREF(Py_None); + __pyx_t_5 = Py_None; + } + __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_5); + __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":514 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # should drop the + * indexes[i] = word.index + */ + __pyx_t_6 = (__pyx_v_word == Py_None); + __pyx_t_8 = (__pyx_t_6 != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":515 + * word = vlookup[token] if token in vlookup else None + * if word is None: + * continue # should drop the # <<<<<<<<<<<<<< + * indexes[i] = word.index + * codelens[i] = len(word.code) + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":514 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # should drop the + * indexes[i] = word.index + */ + } + + /* "word2vec_inner_in_works.pyx":516 + * if word is None: + * continue # should drop the + * indexes[i] = word.index # <<<<<<<<<<<<<< + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = __Pyx_PyInt_As_npy_uint32(__pyx_t_5); if (unlikely((__pyx_t_9 == (npy_uint32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_indexes[__pyx_v_i]) = __pyx_t_9; + + /* "word2vec_inner_in_works.pyx":517 + * continue # should drop the + * indexes[i] = word.index + * codelens[i] = len(word.code) # <<<<<<<<<<<<<< + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_codelens[__pyx_v_i]) = ((int)__pyx_t_10); + + /* "word2vec_inner_in_works.pyx":518 + * indexes[i] = word.index + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) # <<<<<<<<<<<<<< + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_i]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":519 + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) # <<<<<<<<<<<<<< + * result += 1 + * i += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_i]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":520 + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + * result += 1 # <<<<<<<<<<<<<< + * i += 1 + * if i == MAX_SENTENCE_LEN: + */ + __pyx_v_result = (__pyx_v_result + 1); + + /* "word2vec_inner_in_works.pyx":521 + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + * i += 1 # <<<<<<<<<<<<<< + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "word2vec_inner_in_works.pyx":522 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + __pyx_t_8 = ((__pyx_v_i == 0x2710) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":523 + * i += 1 + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< + * sentence_len = i + * + */ + goto __pyx_L4_break; + + /* "word2vec_inner_in_works.pyx":522 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + } + + /* "word2vec_inner_in_works.pyx":512 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + __pyx_L3_continue:; + } + __pyx_L4_break:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":524 + * 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; + + /* "word2vec_inner_in_works.pyx":527 + * + * # release GIL & train on the sentence + * work[0] = 0.0 # <<<<<<<<<<<<<< + * + * with nogil: + */ + (__pyx_v_work[0]) = 0.0; + + /* "word2vec_inner_in_works.pyx":529 + * work[0] = 0.0 + * + * with nogil: # <<<<<<<<<<<<<< + * if not sc: + * for i in range(sentence_len): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + #endif + /*try:*/ { + + /* "word2vec_inner_in_works.pyx":530 + * + * with nogil: + * if not sc: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + __pyx_t_8 = ((!(__pyx_v_sc != 0)) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":531 + * with nogil: + * if not sc: + * for i in range(sentence_len): # <<<<<<<<<<<<<< + * if codelens[i] == 0: + * continue + */ + __pyx_t_2 = __pyx_v_sentence_len; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_2; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "word2vec_inner_in_works.pyx":532 + * if not sc: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + __pyx_t_8 = (((__pyx_v_codelens[__pyx_v_i]) == 0) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":533 + * for i in range(sentence_len): + * if codelens[i] == 0: + * continue # <<<<<<<<<<<<<< + * j = i - window + * if j < 0: + */ + goto __pyx_L11_continue; + + /* "word2vec_inner_in_works.pyx":532 + * if not sc: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + } + + /* "word2vec_inner_in_works.pyx":534 + * if codelens[i] == 0: + * continue + * j = i - window # <<<<<<<<<<<<<< + * if j < 0: + * j = 0 + */ + __pyx_v_j = (__pyx_v_i - __pyx_v_window); + + /* "word2vec_inner_in_works.pyx":535 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + __pyx_t_8 = ((__pyx_v_j < 0) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":536 + * j = i - window + * if j < 0: + * j = 0 # <<<<<<<<<<<<<< + * k = i + window + 1 + * if k > sentence_len: + */ + __pyx_v_j = 0; + + /* "word2vec_inner_in_works.pyx":535 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + } + + /* "word2vec_inner_in_works.pyx":537 + * if j < 0: + * j = 0 + * k = i + window + 1 # <<<<<<<<<<<<<< + * if k > sentence_len: + * k = sentence_len + */ + __pyx_v_k = ((__pyx_v_i + __pyx_v_window) + 1); + + /* "word2vec_inner_in_works.pyx":538 + * j = 0 + * k = i + window + 1 + * if k > sentence_len: # <<<<<<<<<<<<<< + * k = sentence_len + * for j in range(j, k): + */ + __pyx_t_8 = ((__pyx_v_k > __pyx_v_sentence_len) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":539 + * k = i + window + 1 + * if k > sentence_len: + * k = sentence_len # <<<<<<<<<<<<<< + * for j in range(j, k): + * if j == i or codelens[j] == 0: + */ + __pyx_v_k = __pyx_v_sentence_len; + + /* "word2vec_inner_in_works.pyx":538 + * j = 0 + * k = i + window + 1 + * if k > sentence_len: # <<<<<<<<<<<<<< + * k = sentence_len + * for j in range(j, k): + */ + } + + /* "word2vec_inner_in_works.pyx":540 + * if k > sentence_len: + * k = sentence_len + * for j in range(j, k): # <<<<<<<<<<<<<< + * if j == i or codelens[j] == 0: + * continue + */ + __pyx_t_12 = __pyx_v_k; + for (__pyx_t_13 = __pyx_v_j; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { + __pyx_v_j = __pyx_t_13; + + /* "word2vec_inner_in_works.pyx":541 + * k = sentence_len + * for j in range(j, k): + * if j == i or codelens[j] == 0: # <<<<<<<<<<<<<< + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + */ + __pyx_t_6 = ((__pyx_v_j == __pyx_v_i) != 0); + if (!__pyx_t_6) { + } else { + __pyx_t_8 = __pyx_t_6; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_6 = (((__pyx_v_codelens[__pyx_v_j]) == 0) != 0); + __pyx_t_8 = __pyx_t_6; + __pyx_L19_bool_binop_done:; + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":542 + * for j in range(j, k): + * if j == i or codelens[j] == 0: + * continue # <<<<<<<<<<<<<< + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + * if sc: + */ + goto __pyx_L16_continue; + + /* "word2vec_inner_in_works.pyx":541 + * k = sentence_len + * for j in range(j, k): + * if j == i or codelens[j] == 0: # <<<<<<<<<<<<<< + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + */ + } + + /* "word2vec_inner_in_works.pyx":543 + * if j == i or codelens[j] == 0: + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) # <<<<<<<<<<<<<< + * if sc: + * i = 0 + */ + __pyx_f_23word2vec_inner_in_works_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); + __pyx_L16_continue:; + } + __pyx_L11_continue:; + } + + /* "word2vec_inner_in_works.pyx":530 + * + * with nogil: + * if not sc: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + } + + /* "word2vec_inner_in_works.pyx":544 + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + * if sc: # <<<<<<<<<<<<<< + * i = 0 + * if codelens[i] == 0: + */ + __pyx_t_8 = (__pyx_v_sc != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":545 + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + * if sc: + * i = 0 # <<<<<<<<<<<<<< + * if codelens[i] == 0: + * pass + */ + __pyx_v_i = 0; + + /* "word2vec_inner_in_works.pyx":546 + * if sc: + * i = 0 + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * pass + * else: + */ + __pyx_t_8 = (((__pyx_v_codelens[__pyx_v_i]) == 0) != 0); + if (__pyx_t_8) { + goto __pyx_L22; + } + + /* "word2vec_inner_in_works.pyx":549 + * pass + * else: + * j = 0 # <<<<<<<<<<<<<< + * k = sentence_len + * for j in range(j, k): + */ + /*else*/ { + __pyx_v_j = 0; + + /* "word2vec_inner_in_works.pyx":550 + * else: + * j = 0 + * k = sentence_len # <<<<<<<<<<<<<< + * for j in range(j, k): + * if j == i or codelens[j] == 0: + */ + __pyx_v_k = __pyx_v_sentence_len; + + /* "word2vec_inner_in_works.pyx":551 + * j = 0 + * k = sentence_len + * for j in range(j, k): # <<<<<<<<<<<<<< + * if j == i or codelens[j] == 0: + * continue + */ + __pyx_t_2 = __pyx_v_k; + for (__pyx_t_11 = __pyx_v_j; __pyx_t_11 < __pyx_t_2; __pyx_t_11+=1) { + __pyx_v_j = __pyx_t_11; + + /* "word2vec_inner_in_works.pyx":552 + * k = sentence_len + * for j in range(j, k): + * if j == i or codelens[j] == 0: # <<<<<<<<<<<<<< + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + */ + __pyx_t_6 = ((__pyx_v_j == __pyx_v_i) != 0); + if (!__pyx_t_6) { + } else { + __pyx_t_8 = __pyx_t_6; + goto __pyx_L26_bool_binop_done; + } + __pyx_t_6 = (((__pyx_v_codelens[__pyx_v_j]) == 0) != 0); + __pyx_t_8 = __pyx_t_6; + __pyx_L26_bool_binop_done:; + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":553 + * for j in range(j, k): + * 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_L23_continue; + + /* "word2vec_inner_in_works.pyx":552 + * k = sentence_len + * for j in range(j, k): + * if j == i or codelens[j] == 0: # <<<<<<<<<<<<<< + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + */ + } + + /* "word2vec_inner_in_works.pyx":554 + * if j == i or codelens[j] == 0: + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) # <<<<<<<<<<<<<< + * + * + */ + __pyx_f_23word2vec_inner_in_works_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); + __pyx_L23_continue:; + } + } + __pyx_L22:; + + /* "word2vec_inner_in_works.pyx":544 + * continue + * score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + * if sc: # <<<<<<<<<<<<<< + * i = 0 + * if codelens[i] == 0: + */ + } + } + + /* "word2vec_inner_in_works.pyx":529 + * work[0] = 0.0 + * + * with nogil: # <<<<<<<<<<<<<< + * if not sc: + * for i in range(sentence_len): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + Py_BLOCK_THREADS + #endif + goto __pyx_L9; + } + __pyx_L9:; + } + } + + /* "word2vec_inner_in_works.pyx":557 + * + * + * return work[0] # <<<<<<<<<<<<<< + * + * cdef void score_pair_sg_hs( + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble((__pyx_v_work[0])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "word2vec_inner_in_works.pyx":486 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("word2vec_inner_in_works.score_sentence_sg", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "word2vec_inner_in_works.pyx":559 + * 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, + */ + +static void __pyx_f_23word2vec_inner_in_works_score_pair_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_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const __pyx_v_word2_index, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row1; + PY_LONG_LONG __pyx_v_row2; + PY_LONG_LONG __pyx_v_sgn; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_f; + int __pyx_t_1; + PY_LONG_LONG __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + long __pyx_t_5; + + /* "word2vec_inner_in_works.pyx":565 + * + * 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); + + /* "word2vec_inner_in_works.pyx":568 + * cdef REAL_t f + * + * for b in range(codelen): # <<<<<<<<<<<<<< + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + */ + __pyx_t_1 = __pyx_v_codelen; + for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { + __pyx_v_b = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":569 + * + * for b in range(codelen): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":570 + * for b in range(codelen): + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + */ + __pyx_v_f = __pyx_v_23word2vec_inner_in_works_our_dot((&__pyx_v_size), (&(__pyx_v_syn0[__pyx_v_row1])), (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":571 + * row2 = word_point[b] * size + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 # <<<<<<<<<<<<<< + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_sgn = __Pyx_pow_long(-1L, ((long)(__pyx_v_word_code[__pyx_v_b]))); + + /* "word2vec_inner_in_works.pyx":572 + * f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = (__pyx_v_sgn * __pyx_v_f); + + /* "word2vec_inner_in_works.pyx":573 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L6_bool_binop_done:; + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":574 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * work[0] += f + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":573 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "word2vec_inner_in_works.pyx":575 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * work[0] += f + * + */ + __pyx_v_f = (__pyx_v_23word2vec_inner_in_works_LOG_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "word2vec_inner_in_works.pyx":576 + * 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; + (__pyx_v_work[__pyx_t_5]) = ((__pyx_v_work[__pyx_t_5]) + __pyx_v_f); + __pyx_L3_continue:; + } + + /* "word2vec_inner_in_works.pyx":559 + * 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, + */ + + /* function exit code */ +} + +/* "word2vec_inner_in_works.pyx":578 + * work[0] += f + * + * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< + * + * cdef int cbow_mean = model.cbow_mean + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_23word2vec_inner_in_works_7score_sentence_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_23word2vec_inner_in_works_7score_sentence_cbow = {"score_sentence_cbow", (PyCFunction)__pyx_pw_23word2vec_inner_in_works_7score_sentence_cbow, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_23word2vec_inner_in_works_7score_sentence_cbow(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_model = 0; + PyObject *__pyx_v_sentence = 0; + PyObject *__pyx_v__work = 0; + PyObject *__pyx_v__neu1 = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("score_sentence_cbow (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_model,&__pyx_n_s_sentence,&__pyx_n_s_work,&__pyx_n_s_neu1,0}; + PyObject* values[4] = {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 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_sentence)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_work)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_neu1)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "score_sentence_cbow") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { + 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); + } + __pyx_v_model = values[0]; + __pyx_v_sentence = values[1]; + __pyx_v__work = values[2]; + __pyx_v__neu1 = values[3]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("score_sentence_cbow", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("word2vec_inner_in_works.score_sentence_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_23word2vec_inner_in_works_6score_sentence_cbow(__pyx_self, __pyx_v_model, __pyx_v_sentence, __pyx_v__work, __pyx_v__neu1); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_23word2vec_inner_in_works_6score_sentence_cbow(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_model, PyObject *__pyx_v_sentence, PyObject *__pyx_v__work, PyObject *__pyx_v__neu1) { + int __pyx_v_cbow_mean; + int __pyx_v_sc; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_neu1; + int __pyx_v_size; + int __pyx_v_codelens[0x2710]; + __pyx_t_5numpy_uint32_t __pyx_v_indexes[0x2710]; + int __pyx_v_sentence_len; + int __pyx_v_window; + int __pyx_v_i; + int __pyx_v_j; + int __pyx_v_k; + long __pyx_v_result; + __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn1; + __pyx_t_5numpy_uint32_t *__pyx_v_points[0x2710]; + __pyx_t_5numpy_uint8_t *__pyx_v_codes[0x2710]; + PyObject *__pyx_v_vlookup = NULL; + PyObject *__pyx_v_token = NULL; + PyObject *__pyx_v_word = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + PyObject *(*__pyx_t_4)(PyObject *); + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + __pyx_t_5numpy_uint32_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("score_sentence_cbow", 0); + + /* "word2vec_inner_in_works.pyx":580 + * def score_sentence_cbow(model, sentence, _work, _neu1): + * + * cdef int cbow_mean = model.cbow_mean # <<<<<<<<<<<<<< + * cdef int sc = model.synt_cont + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_cbow_mean); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 580; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_cbow_mean = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":581 + * + * cdef int cbow_mean = model.cbow_mean + * cdef int sc = model.synt_cont # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_synt_cont); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 581; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_sc = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":583 + * cdef int sc = model.synt_cont + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) # <<<<<<<<<<<<<< + * cdef REAL_t *work + * cdef REAL_t *neu1 + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn0 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":586 + * cdef REAL_t *work + * cdef REAL_t *neu1 + * 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_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_size = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":591 + * cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + * cdef int sentence_len + * 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_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_window = __pyx_t_2; + + /* "word2vec_inner_in_works.pyx":594 + * + * cdef int i, j, k + * cdef long result = 0 # <<<<<<<<<<<<<< + * + * # For hierarchical softmax + */ + __pyx_v_result = 0; + + /* "word2vec_inner_in_works.pyx":601 + * 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_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_syn1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_syn1 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_1))); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":604 + * + * # 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_filename = __pyx_f[0]; __pyx_lineno = 604; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_work = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__work))); + + /* "word2vec_inner_in_works.pyx":605 + * # convert Python structures to primitive types, so we can release the GIL + * work = np.PyArray_DATA(_work) + * neu1 = np.PyArray_DATA(_neu1) # <<<<<<<<<<<<<< + * + * vlookup = model.vocab + */ + if (!(likely(((__pyx_v__neu1) == Py_None) || likely(__Pyx_TypeTest(__pyx_v__neu1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 605; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_neu1 = ((__pyx_t_23word2vec_inner_in_works_REAL_t *)PyArray_DATA(((PyArrayObject *)__pyx_v__neu1))); + + /* "word2vec_inner_in_works.pyx":607 + * neu1 = np.PyArray_DATA(_neu1) + * + * vlookup = model.vocab # <<<<<<<<<<<<<< + * i = 0 + * for token in sentence: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_model, __pyx_n_s_vocab); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 607; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_vlookup = __pyx_t_1; + __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":608 + * + * vlookup = model.vocab + * i = 0 # <<<<<<<<<<<<<< + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + */ + __pyx_v_i = 0; + + /* "word2vec_inner_in_works.pyx":609 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + if (likely(PyList_CheckExact(__pyx_v_sentence)) || PyTuple_CheckExact(__pyx_v_sentence)) { + __pyx_t_1 = __pyx_v_sentence; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0; + __pyx_t_4 = NULL; + } else { + __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sentence); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (likely(!__pyx_t_4)) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } else { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + #endif + } + } else { + __pyx_t_5 = __pyx_t_4(__pyx_t_1); + if (unlikely(!__pyx_t_5)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_5); + } + __Pyx_XDECREF_SET(__pyx_v_token, __pyx_t_5); + __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":610 + * i = 0 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None # <<<<<<<<<<<<<< + * if word is None: + * continue # for score, should this be a default negative value? + */ + __pyx_t_6 = (__Pyx_PySequence_ContainsTF(__pyx_v_token, __pyx_v_vlookup, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if ((__pyx_t_6 != 0)) { + __pyx_t_7 = PyObject_GetItem(__pyx_v_vlookup, __pyx_v_token); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = __pyx_t_7; + __pyx_t_7 = 0; + } else { + __Pyx_INCREF(Py_None); + __pyx_t_5 = Py_None; + } + __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_5); + __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":611 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # for score, should this be a default negative value? + * indexes[i] = word.index + */ + __pyx_t_6 = (__pyx_v_word == Py_None); + __pyx_t_8 = (__pyx_t_6 != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":612 + * word = vlookup[token] if token in vlookup else None + * if word is None: + * continue # for score, should this be a default negative value? # <<<<<<<<<<<<<< + * indexes[i] = word.index + * codelens[i] = len(word.code) + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":611 + * for token in sentence: + * word = vlookup[token] if token in vlookup else None + * if word is None: # <<<<<<<<<<<<<< + * continue # for score, should this be a default negative value? + * indexes[i] = word.index + */ + } + + /* "word2vec_inner_in_works.pyx":613 + * if word is None: + * continue # for score, should this be a default negative value? + * indexes[i] = word.index # <<<<<<<<<<<<<< + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_index); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = __Pyx_PyInt_As_npy_uint32(__pyx_t_5); if (unlikely((__pyx_t_9 == (npy_uint32)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_indexes[__pyx_v_i]) = __pyx_t_9; + + /* "word2vec_inner_in_works.pyx":614 + * continue # for score, should this be a default negative value? + * indexes[i] = word.index + * codelens[i] = len(word.code) # <<<<<<<<<<<<<< + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = PyObject_Length(__pyx_t_5); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + (__pyx_v_codelens[__pyx_v_i]) = ((int)__pyx_t_10); + + /* "word2vec_inner_in_works.pyx":615 + * indexes[i] = word.index + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) # <<<<<<<<<<<<<< + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_code); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_codes[__pyx_v_i]) = ((__pyx_t_5numpy_uint8_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":616 + * codelens[i] = len(word.code) + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) # <<<<<<<<<<<<<< + * result += 1 + * i += 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_point); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_points[__pyx_v_i]) = ((__pyx_t_5numpy_uint32_t *)PyArray_DATA(((PyArrayObject *)__pyx_t_5))); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":617 + * codes[i] = np.PyArray_DATA(word.code) + * points[i] = np.PyArray_DATA(word.point) + * result += 1 # <<<<<<<<<<<<<< + * i += 1 + * if i == MAX_SENTENCE_LEN: + */ + __pyx_v_result = (__pyx_v_result + 1); + + /* "word2vec_inner_in_works.pyx":618 + * points[i] = np.PyArray_DATA(word.point) + * result += 1 + * i += 1 # <<<<<<<<<<<<<< + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? + */ + __pyx_v_i = (__pyx_v_i + 1); + + /* "word2vec_inner_in_works.pyx":619 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + __pyx_t_8 = ((__pyx_v_i == 0x2710) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":620 + * i += 1 + * if i == MAX_SENTENCE_LEN: + * break # TODO: log warning, tally overflow? # <<<<<<<<<<<<<< + * sentence_len = i + * + */ + goto __pyx_L4_break; + + /* "word2vec_inner_in_works.pyx":619 + * result += 1 + * i += 1 + * if i == MAX_SENTENCE_LEN: # <<<<<<<<<<<<<< + * break # TODO: log warning, tally overflow? + * sentence_len = i + */ + } + + /* "word2vec_inner_in_works.pyx":609 + * vlookup = model.vocab + * i = 0 + * for token in sentence: # <<<<<<<<<<<<<< + * word = vlookup[token] if token in vlookup else None + * if word is None: + */ + __pyx_L3_continue:; + } + __pyx_L4_break:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":621 + * 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; + + /* "word2vec_inner_in_works.pyx":624 + * + * # release GIL & train on the sentence + * work[0] = 0.0 # <<<<<<<<<<<<<< + * with nogil: + * if not sc: + */ + (__pyx_v_work[0]) = 0.0; + + /* "word2vec_inner_in_works.pyx":625 + * # release GIL & train on the sentence + * work[0] = 0.0 + * with nogil: # <<<<<<<<<<<<<< + * if not sc: + * for i in range(sentence_len): + */ + { + #ifdef WITH_THREAD + PyThreadState *_save; + Py_UNBLOCK_THREADS + #endif + /*try:*/ { + + /* "word2vec_inner_in_works.pyx":626 + * work[0] = 0.0 + * with nogil: + * if not sc: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + __pyx_t_8 = ((!(__pyx_v_sc != 0)) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":627 + * with nogil: + * if not sc: + * for i in range(sentence_len): # <<<<<<<<<<<<<< + * if codelens[i] == 0: + * continue + */ + __pyx_t_2 = __pyx_v_sentence_len; + for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_2; __pyx_t_11+=1) { + __pyx_v_i = __pyx_t_11; + + /* "word2vec_inner_in_works.pyx":628 + * if not sc: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + __pyx_t_8 = (((__pyx_v_codelens[__pyx_v_i]) == 0) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":629 + * for i in range(sentence_len): + * if codelens[i] == 0: + * continue # <<<<<<<<<<<<<< + * j = i - window + * if j < 0: + */ + goto __pyx_L11_continue; + + /* "word2vec_inner_in_works.pyx":628 + * if not sc: + * for i in range(sentence_len): + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * continue + * j = i - window + */ + } + + /* "word2vec_inner_in_works.pyx":630 + * if codelens[i] == 0: + * continue + * j = i - window # <<<<<<<<<<<<<< + * if j < 0: + * j = 0 + */ + __pyx_v_j = (__pyx_v_i - __pyx_v_window); + + /* "word2vec_inner_in_works.pyx":631 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + __pyx_t_8 = ((__pyx_v_j < 0) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":632 + * j = i - window + * if j < 0: + * j = 0 # <<<<<<<<<<<<<< + * k = i + window + 1 + * if k > sentence_len: + */ + __pyx_v_j = 0; + + /* "word2vec_inner_in_works.pyx":631 + * continue + * j = i - window + * if j < 0: # <<<<<<<<<<<<<< + * j = 0 + * k = i + window + 1 + */ + } + + /* "word2vec_inner_in_works.pyx":633 + * if j < 0: + * j = 0 + * k = i + window + 1 # <<<<<<<<<<<<<< + * if k > sentence_len: + * k = sentence_len + */ + __pyx_v_k = ((__pyx_v_i + __pyx_v_window) + 1); + + /* "word2vec_inner_in_works.pyx":634 + * j = 0 + * k = i + window + 1 + * 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_t_8 = ((__pyx_v_k > __pyx_v_sentence_len) != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":635 + * k = i + window + 1 + * 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) + * if sc: + */ + __pyx_v_k = __pyx_v_sentence_len; + + /* "word2vec_inner_in_works.pyx":634 + * j = 0 + * k = i + window + 1 + * 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) + */ + } + + /* "word2vec_inner_in_works.pyx":636 + * 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) # <<<<<<<<<<<<<< + * if sc: + * i = 0 + */ + __pyx_f_23word2vec_inner_in_works_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); + __pyx_L11_continue:; + } + + /* "word2vec_inner_in_works.pyx":626 + * work[0] = 0.0 + * with nogil: + * if not sc: # <<<<<<<<<<<<<< + * for i in range(sentence_len): + * if codelens[i] == 0: + */ + } + + /* "word2vec_inner_in_works.pyx":637 + * k = sentence_len + * score_pair_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, work, i, j, k, cbow_mean) + * if sc: # <<<<<<<<<<<<<< + * i = 0 + * if codelens[i] == 0: + */ + __pyx_t_8 = (__pyx_v_sc != 0); + if (__pyx_t_8) { + + /* "word2vec_inner_in_works.pyx":638 + * score_pair_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, work, i, j, k, cbow_mean) + * if sc: + * i = 0 # <<<<<<<<<<<<<< + * if codelens[i] == 0: + * pass + */ + __pyx_v_i = 0; + + /* "word2vec_inner_in_works.pyx":639 + * if sc: + * i = 0 + * if codelens[i] == 0: # <<<<<<<<<<<<<< + * pass + * else: + */ + __pyx_t_8 = (((__pyx_v_codelens[__pyx_v_i]) == 0) != 0); + if (__pyx_t_8) { + goto __pyx_L17; + } + + /* "word2vec_inner_in_works.pyx":642 + * pass + * else: + * j = 0 # <<<<<<<<<<<<<< + * k = sentence_len + * score_pair_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, work, i, j, k, cbow_mean) + */ + /*else*/ { + __pyx_v_j = 0; + + /* "word2vec_inner_in_works.pyx":643 + * else: + * j = 0 + * 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; + + /* "word2vec_inner_in_works.pyx":644 + * j = 0 + * 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_23word2vec_inner_in_works_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); + } + __pyx_L17:; + + /* "word2vec_inner_in_works.pyx":637 + * k = sentence_len + * score_pair_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, work, i, j, k, cbow_mean) + * if sc: # <<<<<<<<<<<<<< + * i = 0 + * if codelens[i] == 0: + */ + } + } + + /* "word2vec_inner_in_works.pyx":625 + * # release GIL & train on the sentence + * work[0] = 0.0 + * with nogil: # <<<<<<<<<<<<<< + * if not sc: + * for i in range(sentence_len): + */ + /*finally:*/ { + /*normal exit:*/{ + #ifdef WITH_THREAD + Py_BLOCK_THREADS + #endif + goto __pyx_L9; + } + __pyx_L9:; + } + } + + /* "word2vec_inner_in_works.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); + __pyx_t_1 = PyFloat_FromDouble((__pyx_v_work[0])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 646; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "word2vec_inner_in_works.pyx":578 + * work[0] += f + * + * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< + * + * cdef int cbow_mean = model.cbow_mean + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("word2vec_inner_in_works.score_sentence_cbow", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_vlookup); + __Pyx_XDECREF(__pyx_v_token); + __Pyx_XDECREF(__pyx_v_word); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "word2vec_inner_in_works.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, + */ + +static void __pyx_f_23word2vec_inner_in_works_score_pair_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_23word2vec_inner_in_works_REAL_t *__pyx_v_neu1, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn0, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_syn1, int const __pyx_v_size, __pyx_t_5numpy_uint32_t const *__pyx_v_indexes, __pyx_t_23word2vec_inner_in_works_REAL_t *__pyx_v_work, int __pyx_v_i, int __pyx_v_j, int __pyx_v_k, int __pyx_v_cbow_mean) { + PY_LONG_LONG __pyx_v_b; + PY_LONG_LONG __pyx_v_row2; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_f; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_count; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_inv_count; + __pyx_t_23word2vec_inner_in_works_REAL_t __pyx_v_sgn; + int __pyx_v_m; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PY_LONG_LONG __pyx_t_5; + long __pyx_t_6; + + /* "word2vec_inner_in_works.pyx":659 + * 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_23word2vec_inner_in_works_REAL_t)))); + + /* "word2vec_inner_in_works.pyx":660 + * + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 # <<<<<<<<<<<<<< + * for m in range(j, k): + * if m == i or codelens[m] == 0: + */ + __pyx_v_count = ((__pyx_t_23word2vec_inner_in_works_REAL_t)0.0); + + /* "word2vec_inner_in_works.pyx":661 + * memset(neu1, 0, size * cython.sizeof(REAL_t)) + * count = 0.0 + * for m in range(j, k): # <<<<<<<<<<<<<< + * if m == i or codelens[m] == 0: + * 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; + + /* "word2vec_inner_in_works.pyx":662 + * count = 0.0 + * for m in range(j, k): + * if m == i or codelens[m] == 0: # <<<<<<<<<<<<<< + * continue + * else: + */ + __pyx_t_4 = ((__pyx_v_m == __pyx_v_i) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L6_bool_binop_done; + } + __pyx_t_4 = (((__pyx_v_codelens[__pyx_v_m]) == 0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L6_bool_binop_done:; + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":663 + * for m in range(j, k): + * if m == i or codelens[m] == 0: + * continue # <<<<<<<<<<<<<< + * else: + * count += ONEF + */ + goto __pyx_L3_continue; + + /* "word2vec_inner_in_works.pyx":662 + * count = 0.0 + * for m in range(j, k): + * if m == i or codelens[m] == 0: # <<<<<<<<<<<<<< + * continue + * else: + */ + } + + /* "word2vec_inner_in_works.pyx":665 + * continue + * else: + * count += ONEF # <<<<<<<<<<<<<< + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): + */ + /*else*/ { + __pyx_v_count = (__pyx_v_count + __pyx_v_23word2vec_inner_in_works_ONEF); + + /* "word2vec_inner_in_works.pyx":666 + * else: + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) # <<<<<<<<<<<<<< + * if count > (0.5): + * inv_count = ONEF/count + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy((&__pyx_v_size), (&__pyx_v_23word2vec_inner_in_works_ONEF), (&(__pyx_v_syn0[((__pyx_v_indexes[__pyx_v_m]) * __pyx_v_size)])), (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE)); + } + __pyx_L3_continue:; + } + + /* "word2vec_inner_in_works.pyx":667 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + __pyx_t_3 = ((__pyx_v_count > ((__pyx_t_23word2vec_inner_in_works_REAL_t)0.5)) != 0); + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":668 + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * 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_23word2vec_inner_in_works_ONEF / __pyx_v_count); + + /* "word2vec_inner_in_works.pyx":667 + * count += ONEF + * our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + * if count > (0.5): # <<<<<<<<<<<<<< + * inv_count = ONEF/count + * if cbow_mean: + */ + } + + /* "word2vec_inner_in_works.pyx":669 + * 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) { + + /* "word2vec_inner_in_works.pyx":670 + * inv_count = ONEF/count + * if cbow_mean: + * sscal(&size, &inv_count, neu1, &ONE) # <<<<<<<<<<<<<< + * + * for b in range(codelens[i]): + */ + __pyx_v_23word2vec_inner_in_works_sscal((&__pyx_v_size), (&__pyx_v_inv_count), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":669 + * if count > (0.5): + * inv_count = ONEF/count + * if cbow_mean: # <<<<<<<<<<<<<< + * sscal(&size, &inv_count, neu1, &ONE) + * + */ + } + + /* "word2vec_inner_in_works.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) + */ + __pyx_t_1 = (__pyx_v_codelens[__pyx_v_i]); + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_1; __pyx_t_5+=1) { + __pyx_v_b = __pyx_t_5; + + /* "word2vec_inner_in_works.pyx":673 + * + * for b in range(codelens[i]): + * row2 = word_point[b] * size # <<<<<<<<<<<<<< + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + */ + __pyx_v_row2 = ((__pyx_v_word_point[__pyx_v_b]) * __pyx_v_size); + + /* "word2vec_inner_in_works.pyx":674 + * for b in range(codelens[i]): + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) # <<<<<<<<<<<<<< + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + */ + __pyx_v_f = __pyx_v_23word2vec_inner_in_works_our_dot((&__pyx_v_size), __pyx_v_neu1, (&__pyx_v_23word2vec_inner_in_works_ONE), (&(__pyx_v_syn1[__pyx_v_row2])), (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":675 + * row2 = word_point[b] * size + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 # <<<<<<<<<<<<<< + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + */ + __pyx_v_sgn = __Pyx_pow_long(-1L, ((long)(__pyx_v_word_code[__pyx_v_b]))); + + /* "word2vec_inner_in_works.pyx":676 + * f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f # <<<<<<<<<<<<<< + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + */ + __pyx_v_f = (__pyx_v_sgn * __pyx_v_f); + + /* "word2vec_inner_in_works.pyx":677 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + __pyx_t_4 = ((__pyx_v_f <= -6.0) != 0); + if (!__pyx_t_4) { + } else { + __pyx_t_3 = __pyx_t_4; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_4 = ((__pyx_v_f >= 6.0) != 0); + __pyx_t_3 = __pyx_t_4; + __pyx_L13_bool_binop_done:; + if (__pyx_t_3) { + + /* "word2vec_inner_in_works.pyx":678 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue # <<<<<<<<<<<<<< + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + * work[0] += f + */ + goto __pyx_L10_continue; + + /* "word2vec_inner_in_works.pyx":677 + * sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + * f = sgn*f + * if f <= -MAX_EXP or f >= MAX_EXP: # <<<<<<<<<<<<<< + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + */ + } + + /* "word2vec_inner_in_works.pyx":679 + * if f <= -MAX_EXP or f >= MAX_EXP: + * continue + * f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] # <<<<<<<<<<<<<< + * work[0] += f + * + */ + __pyx_v_f = (__pyx_v_23word2vec_inner_in_works_LOG_TABLE[((int)((__pyx_v_f + 6.0) * 83.0))]); + + /* "word2vec_inner_in_works.pyx":680 + * 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); + __pyx_L10_continue:; + } + + /* "word2vec_inner_in_works.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, + */ + + /* function exit code */ +} + +/* "word2vec_inner_in_works.pyx":683 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_23word2vec_inner_in_works_9init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_23word2vec_inner_in_works_8init[] = "\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\n "; +static PyMethodDef __pyx_mdef_23word2vec_inner_in_works_9init = {"init", (PyCFunction)__pyx_pw_23word2vec_inner_in_works_9init, METH_NOARGS, __pyx_doc_23word2vec_inner_in_works_8init}; +static PyObject *__pyx_pw_23word2vec_inner_in_works_9init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("init (wrapper)", 0); + __pyx_r = __pyx_pf_23word2vec_inner_in_works_8init(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_23word2vec_inner_in_works_8init(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); + + /* "word2vec_inner_in_works.pyx":693 + * + * 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; + + /* "word2vec_inner_in_works.pyx":694 + * 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; + + /* "word2vec_inner_in_works.pyx":695 + * 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); + + /* "word2vec_inner_in_works.pyx":696 + * 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; + + /* "word2vec_inner_in_works.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) + * 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; + + /* "word2vec_inner_in_works.pyx":702 + * # 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_23word2vec_inner_in_works_EXP_TABLE[__pyx_v_i]) = ((__pyx_t_23word2vec_inner_in_works_REAL_t)exp(((((__pyx_v_i / ((__pyx_t_23word2vec_inner_in_works_REAL_t)0x3E8)) * 2.0) - 1.0) * 6.0))); + + /* "word2vec_inner_in_works.pyx":703 + * 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_23word2vec_inner_in_works_EXP_TABLE[__pyx_v_i]) = ((__pyx_t_23word2vec_inner_in_works_REAL_t)((__pyx_v_23word2vec_inner_in_works_EXP_TABLE[__pyx_v_i]) / ((__pyx_v_23word2vec_inner_in_works_EXP_TABLE[__pyx_v_i]) + 1.0))); + + /* "word2vec_inner_in_works.pyx":704 + * 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_23word2vec_inner_in_works_LOG_TABLE[__pyx_v_i]) = ((__pyx_t_23word2vec_inner_in_works_REAL_t)log((__pyx_v_23word2vec_inner_in_works_EXP_TABLE[__pyx_v_i]))); + } + + /* "word2vec_inner_in_works.pyx":707 + * + * # 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_23word2vec_inner_in_works_dsdot((&__pyx_v_size), __pyx_v_x, (&__pyx_v_23word2vec_inner_in_works_ONE), __pyx_v_y, (&__pyx_v_23word2vec_inner_in_works_ONE)); + + /* "word2vec_inner_in_works.pyx":708 + * # 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)); + + /* "word2vec_inner_in_works.pyx":709 + * 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) { + + /* "word2vec_inner_in_works.pyx":710 + * p_res = &d_res + * if (abs(d_res - expected) < 0.0001): + * our_dot = our_dot_double # <<<<<<<<<<<<<< + * our_saxpy = saxpy + * return 0 # double + */ + __pyx_v_23word2vec_inner_in_works_our_dot = __pyx_f_23word2vec_inner_in_works_our_dot_double; + + /* "word2vec_inner_in_works.pyx":711 + * 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_23word2vec_inner_in_works_our_saxpy = __pyx_v_23word2vec_inner_in_works_saxpy; + + /* "word2vec_inner_in_works.pyx":712 + * 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; + + /* "word2vec_inner_in_works.pyx":709 + * 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 + */ + } + + /* "word2vec_inner_in_works.pyx":713 + * 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) { + + /* "word2vec_inner_in_works.pyx":714 + * return 0 # double + * elif (abs(p_res[0] - expected) < 0.0001): + * our_dot = our_dot_float # <<<<<<<<<<<<<< + * our_saxpy = saxpy + * return 1 # float + */ + __pyx_v_23word2vec_inner_in_works_our_dot = __pyx_f_23word2vec_inner_in_works_our_dot_float; + + /* "word2vec_inner_in_works.pyx":715 + * elif (abs(p_res[0] - expected) < 0.0001): + * our_dot = our_dot_float + * our_saxpy = saxpy # <<<<<<<<<<<<<< + * return 1 # float + * else: + */ + __pyx_v_23word2vec_inner_in_works_our_saxpy = __pyx_v_23word2vec_inner_in_works_saxpy; + + /* "word2vec_inner_in_works.pyx":716 + * 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; + + /* "word2vec_inner_in_works.pyx":713 + * our_saxpy = saxpy + * return 0 # double + * elif (abs(p_res[0] - expected) < 0.0001): # <<<<<<<<<<<<<< + * our_dot = our_dot_float + * our_saxpy = saxpy + */ + } + + /* "word2vec_inner_in_works.pyx":720 + * # 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_23word2vec_inner_in_works_our_dot = __pyx_f_23word2vec_inner_in_works_our_dot_noblas; + + /* "word2vec_inner_in_works.pyx":721 + * # 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_23word2vec_inner_in_works_our_saxpy = __pyx_f_23word2vec_inner_in_works_our_saxpy_noblas; + + /* "word2vec_inner_in_works.pyx":722 + * 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; + } + + /* "word2vec_inner_in_works.pyx":683 + * + * + * 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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __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); + } + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../anaconda3/lib/python3.5/site-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") + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../anaconda3/lib/python3.5/site-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") + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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))); + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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]); + + /* "../../../../anaconda3/lib/python3.5/site-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]); + } + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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)); + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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)); + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../anaconda3/lib/python3.5/site-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") + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_b; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_B; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_h; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_H; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_i; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_I; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_l; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_L; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_q; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_Q; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_f; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_d; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_g; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_Zf; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_Zd; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_Zg; + break; + + /* "../../../../anaconda3/lib/python3.5/site-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 = __pyx_k_O; + break; + default: + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + break; + } + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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 + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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)); + + /* "../../../../anaconda3/lib/python3.5/site-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]) = '^'; + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_7; + + /* "../../../../anaconda3/lib/python3.5/site-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'; + } + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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): + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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 + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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(); +} + +/* "../../../../anaconda3/lib/python3.5/site-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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __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_COMPILING_IN_CPYTHON + __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_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../../../anaconda3/lib/python3.5/site-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_CPYTHON + 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_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if CYTHON_COMPILING_IN_CPYTHON + __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_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __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; + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __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) { + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../anaconda3/lib/python3.5/site-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") + * + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../anaconda3/lib/python3.5/site-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") + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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); + } + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../anaconda3/lib/python3.5/site-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.") + * + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_L15:; + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +/* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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:; + + /* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-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(); +} + +/* "../../../../anaconda3/lib/python3.5/site-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); + + /* "../../../../anaconda3/lib/python3.5/site-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) { + + /* "../../../../anaconda3/lib/python3.5/site-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; + + /* "../../../../anaconda3/lib/python3.5/site-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../../../anaconda3/lib/python3.5/site-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; + } + + /* "../../../../anaconda3/lib/python3.5/site-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; +} + +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 + "word2vec_inner_in_works", + 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_EXP_TABLE, __pyx_k_EXP_TABLE, sizeof(__pyx_k_EXP_TABLE), 0, 0, 1, 1}, + {&__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__11, __pyx_k__11, sizeof(__pyx_k__11), 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_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_cpointer, __pyx_k_cpointer, sizeof(__pyx_k_cpointer), 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_dsdot, __pyx_k_dsdot, sizeof(__pyx_k_dsdot), 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_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_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_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_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_n_s_our_dot, __pyx_k_our_dot, sizeof(__pyx_k_our_dot), 0, 0, 1, 1}, + {&__pyx_n_s_our_saxpy, __pyx_k_our_saxpy, sizeof(__pyx_k_our_saxpy), 0, 0, 1, 1}, + {&__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_pyx_capi, __pyx_k_pyx_capi, sizeof(__pyx_k_pyx_capi), 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_result, __pyx_k_result, sizeof(__pyx_k_result), 0, 0, 1, 1}, + {&__pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_k_run_media_robert_1TB_1_linuxfol, sizeof(__pyx_k_run_media_robert_1TB_1_linuxfol), 0, 0, 1, 0}, + {&__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_saxpy, __pyx_k_saxpy, sizeof(__pyx_k_saxpy), 0, 0, 1, 1}, + {&__pyx_n_s_sc, __pyx_k_sc, sizeof(__pyx_k_sc), 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_scopy, __pyx_k_scopy, sizeof(__pyx_k_scopy), 0, 0, 1, 1}, + {&__pyx_n_s_score_sentence_cbow, __pyx_k_score_sentence_cbow, sizeof(__pyx_k_score_sentence_cbow), 0, 0, 1, 1}, + {&__pyx_n_s_score_sentence_sg, __pyx_k_score_sentence_sg, sizeof(__pyx_k_score_sentence_sg), 0, 0, 1, 1}, + {&__pyx_n_s_sdot, __pyx_k_sdot, sizeof(__pyx_k_sdot), 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, __pyx_k_sentence, sizeof(__pyx_k_sentence), 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_sentence_len, __pyx_k_sentence_len, sizeof(__pyx_k_sentence_len), 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_snrm2, __pyx_k_snrm2, sizeof(__pyx_k_snrm2), 0, 0, 1, 1}, + {&__pyx_n_s_sscal, __pyx_k_sscal, sizeof(__pyx_k_sscal), 0, 0, 1, 1}, + {&__pyx_n_s_syn0, __pyx_k_syn0, sizeof(__pyx_k_syn0), 0, 0, 1, 1}, + {&__pyx_n_s_syn0_lockf, __pyx_k_syn0_lockf, sizeof(__pyx_k_syn0_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_synt_cont, __pyx_k_synt_cont, sizeof(__pyx_k_synt_cont), 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_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_word2vec_inner_in_works, __pyx_k_word2vec_inner_in_works, sizeof(__pyx_k_word2vec_inner_in_works), 0, 0, 1, 1}, + {&__pyx_n_s_word_locks, __pyx_k_word_locks, sizeof(__pyx_k_word_locks), 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_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_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "word2vec_inner_in_works.pyx":299 + * 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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "word2vec_inner_in_works.pyx":416 + * 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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "../../../../anaconda3/lib/python3.5/site-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_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "word2vec_inner_in_works.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_tuple__12 = PyTuple_Pack(38, __pyx_n_s_model, __pyx_n_s_sentences, __pyx_n_s_alpha, __pyx_n_s_work, __pyx_n_s_hs, __pyx_n_s_negative, __pyx_n_s_sample, __pyx_n_s_sc, __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__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(4, 0, 38, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_train_batch_sg, 257, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "word2vec_inner_in_works.pyx":373 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_tuple__14 = PyTuple_Pack(41, __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_sc, __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__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(5, 0, 41, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_train_batch_cbow, 373, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "word2vec_inner_in_works.pyx":486 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_tuple__16 = PyTuple_Pack(21, __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_sc, __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__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 21, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_score_sentence_sg, 486, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "word2vec_inner_in_works.pyx":578 + * work[0] += f + * + * def score_sentence_cbow(model, sentence, _work, _neu1): # <<<<<<<<<<<<<< + * + * cdef int cbow_mean = model.cbow_mean + */ + __pyx_tuple__18 = PyTuple_Pack(24, __pyx_n_s_model, __pyx_n_s_sentence, __pyx_n_s_work, __pyx_n_s_neu1, __pyx_n_s_cbow_mean, __pyx_n_s_sc, __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__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); + __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(4, 0, 24, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_score_sentence_cbow, 578, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "word2vec_inner_in_works.pyx":683 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + __pyx_tuple__20 = 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__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(0, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_run_media_robert_1TB_1_linuxfol, __pyx_n_s_init, 683, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_10000 = PyInt_FromLong(10000L); if (unlikely(!__pyx_int_10000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_16777216 = PyInt_FromLong(16777216L); if (unlikely(!__pyx_int_16777216)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC initword2vec_inner_in_works(void); /*proto*/ +PyMODINIT_FUNC initword2vec_inner_in_works(void) +#else +PyMODINIT_FUNC PyInit_word2vec_inner_in_works(void); /*proto*/ +PyMODINIT_FUNC PyInit_word2vec_inner_in_works(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; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __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_word2vec_inner_in_works(void)", 0); + if (__Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __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("word2vec_inner_in_works", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + if (__pyx_module_is_main_word2vec_inner_in_works) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!PyDict_GetItemString(modules, "word2vec_inner_in_works")) { + if (unlikely(PyDict_SetItemString(modules, "word2vec_inner_in_works", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + if (__Pyx_ExportVoidPtr(__pyx_n_s_scopy, (void *)&__pyx_v_23word2vec_inner_in_works_scopy, "__pyx_t_23word2vec_inner_in_works_scopy_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_saxpy, (void *)&__pyx_v_23word2vec_inner_in_works_saxpy, "__pyx_t_23word2vec_inner_in_works_saxpy_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_sdot, (void *)&__pyx_v_23word2vec_inner_in_works_sdot, "__pyx_t_23word2vec_inner_in_works_sdot_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_dsdot, (void *)&__pyx_v_23word2vec_inner_in_works_dsdot, "__pyx_t_23word2vec_inner_in_works_dsdot_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_snrm2, (void *)&__pyx_v_23word2vec_inner_in_works_snrm2, "__pyx_t_23word2vec_inner_in_works_snrm2_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_sscal, (void *)&__pyx_v_23word2vec_inner_in_works_sscal, "__pyx_t_23word2vec_inner_in_works_sscal_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_EXP_TABLE, (void *)&__pyx_v_23word2vec_inner_in_works_EXP_TABLE, "__pyx_t_23word2vec_inner_in_works_REAL_t [0x3E8]") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_our_dot, (void *)&__pyx_v_23word2vec_inner_in_works_our_dot, "__pyx_t_23word2vec_inner_in_works_our_dot_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportVoidPtr(__pyx_n_s_our_saxpy, (void *)&__pyx_v_23word2vec_inner_in_works_our_saxpy, "__pyx_t_23word2vec_inner_in_works_our_saxpy_ptr") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Function export code ---*/ + if (__Pyx_ExportFunction("our_dot_double", (void (*)(void))__pyx_f_23word2vec_inner_in_works_our_dot_double, "__pyx_t_23word2vec_inner_in_works_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("our_dot_float", (void (*)(void))__pyx_f_23word2vec_inner_in_works_our_dot_float, "__pyx_t_23word2vec_inner_in_works_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("our_dot_noblas", (void (*)(void))__pyx_f_23word2vec_inner_in_works_our_dot_noblas, "__pyx_t_23word2vec_inner_in_works_REAL_t (int const *, float const *, int const *, float const *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("our_saxpy_noblas", (void (*)(void))__pyx_f_23word2vec_inner_in_works_our_saxpy_noblas, "void (int const *, float const *, float const *, int const *, float *, int const *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("bisect_left", (void (*)(void))__pyx_f_23word2vec_inner_in_works_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_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_ExportFunction("random_int32", (void (*)(void))__pyx_f_23word2vec_inner_in_works_random_int32, "unsigned PY_LONG_LONG (unsigned PY_LONG_LONG *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- 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_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Variable import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + + /* "word2vec_inner_in_works.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_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":19 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + { + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "word2vec_inner_in_works.pyx":20 + * # scipy <= 0.15 + * try: + * from scipy.linalg.blas import fblas # <<<<<<<<<<<<<< + * except ImportError: + * # in scipy > 0.15, fblas function has been removed + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_fblas); + __Pyx_GIVEREF(__pyx_n_s_fblas); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_fblas); + __pyx_t_5 = __Pyx_Import(__pyx_n_s_scipy_linalg_blas, __pyx_t_1, -1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_5, __pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fblas, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L2_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":19 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + } + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L9_try_end; + __pyx_L2_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "word2vec_inner_in_works.pyx":21 + * 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_6 = PyErr_ExceptionMatches(__pyx_builtin_ImportError); + if (__pyx_t_6) { + __Pyx_AddTraceback("word2vec_inner_in_works", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_1, &__pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_7); + + /* "word2vec_inner_in_works.pyx":23 + * 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_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_GOTREF(__pyx_t_8); + __Pyx_INCREF(__pyx_n_s__11); + __Pyx_GIVEREF(__pyx_n_s__11); + PyList_SET_ITEM(__pyx_t_8, 0, __pyx_n_s__11); + __pyx_t_9 = __Pyx_Import(__pyx_n_s_scipy_linalg_blas, __pyx_t_8, -1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_fblas, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L4_except_error;} + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L3_exception_handled; + } + goto __pyx_L4_except_error; + __pyx_L4_except_error:; + + /* "word2vec_inner_in_works.pyx":19 + * + * # scipy <= 0.15 + * try: # <<<<<<<<<<<<<< + * from scipy.linalg.blas import fblas + * except ImportError: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L3_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + __pyx_L9_try_end:; + } + + /* "word2vec_inner_in_works.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_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_float32); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_REAL, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.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) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_scopy); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_23word2vec_inner_in_works_scopy = ((__pyx_t_23word2vec_inner_in_works_scopy_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.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) + * cdef dsdot_ptr dsdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # double = dot(x, y) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_saxpy); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_23word2vec_inner_in_works_saxpy = ((__pyx_t_23word2vec_inner_in_works_saxpy_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":31 + * 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) # <<<<<<<<<<<<<< + * 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) + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_fblas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sdot); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_23word2vec_inner_in_works_sdot = ((__pyx_t_23word2vec_inner_in_works_sdot_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":32 + * 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) + * 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_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sdot); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_23word2vec_inner_in_works_dsdot = ((__pyx_t_23word2vec_inner_in_works_dsdot_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":33 + * cdef sdot_ptr sdot=PyCObject_AsVoidPtr(fblas.sdot._cpointer) # float = dot(x, y) + * 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_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_snrm2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_23word2vec_inner_in_works_snrm2 = ((__pyx_t_23word2vec_inner_in_works_snrm2_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":34 + * 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_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sscal); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_cpointer); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_23word2vec_inner_in_works_sscal = ((__pyx_t_23word2vec_inner_in_works_sscal_ptr)PyCObject_AsVoidPtr(__pyx_t_1)); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":42 + * cdef REAL_t[EXP_TABLE_SIZE] LOG_TABLE + * + * cdef int ONE = 1 # <<<<<<<<<<<<<< + * cdef REAL_t ONEF = 1.0 + * + */ + __pyx_v_23word2vec_inner_in_works_ONE = 1; + + /* "word2vec_inner_in_works.pyx":43 + * + * cdef int ONE = 1 + * cdef REAL_t ONEF = 1.0 # <<<<<<<<<<<<<< + * + * # for when fblas.sdot returns a double + */ + __pyx_v_23word2vec_inner_in_works_ONEF = ((__pyx_t_23word2vec_inner_in_works_REAL_t)1.0); + + /* "word2vec_inner_in_works.pyx":257 + * + * + * def train_batch_sg(model, sentences, alpha, _work): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23word2vec_inner_in_works_1train_batch_sg, NULL, __pyx_n_s_word2vec_inner_in_works); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_train_batch_sg, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":373 + * + * + * def train_batch_cbow(model, sentences, alpha, _work, _neu1): # <<<<<<<<<<<<<< + * cdef int hs = model.hs + * cdef int negative = model.negative + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23word2vec_inner_in_works_3train_batch_cbow, NULL, __pyx_n_s_word2vec_inner_in_works); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_train_batch_cbow, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":486 + * + * # Score is only implemented for hierarchical softmax + * def score_sentence_sg(model, sentence, _work): # <<<<<<<<<<<<<< + * + * cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23word2vec_inner_in_works_5score_sentence_sg, NULL, __pyx_n_s_word2vec_inner_in_works); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_score_sentence_sg, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":578 + * 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_23word2vec_inner_in_works_7score_sentence_cbow, NULL, __pyx_n_s_word2vec_inner_in_works); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_score_sentence_cbow, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":683 + * + * + * def init(): # <<<<<<<<<<<<<< + * """ + * Precompute function `sigmoid(x) = 1 / (1 + exp(-x))`, for x values discretized + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23word2vec_inner_in_works_9init, NULL, __pyx_n_s_word2vec_inner_in_works); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_init, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 683; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":724 + * return 2 + * + * FAST_VERSION = init() # initialize the module # <<<<<<<<<<<<<< + * MAX_WORDS_IN_BATCH = MAX_SENTENCE_LEN + */ + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_init); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_5 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + if (__pyx_t_5) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else { + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FAST_VERSION, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "word2vec_inner_in_works.pyx":725 + * + * 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_filename = __pyx_f[0]; __pyx_lineno = 725; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "word2vec_inner_in_works.pyx":1 + * #!/usr/bin/env cython # <<<<<<<<<<<<<< + * # cython: boundscheck=False + * # cython: wraparound=False + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../../anaconda3/lib/python3.5/site-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 + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init word2vec_inner_in_works", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init word2vec_inner_in_works"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* --- Runtime support code --- */ +#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 + +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; +} + +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); +} + +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 +} + +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; +} + +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; +} + +#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 + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + 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); +#else + PyErr_Restore(type, value, tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(type, value, tb); +#endif +} + +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + 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_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 + +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); +} + +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"); +} + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +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; +} + +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; +} + +static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +#else + PyErr_GetExcInfo(type, value, tb); +#endif +} +static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + 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); +#else + PyErr_SetExcInfo(type, value, tb); +#endif +} + +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + 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_COMPILING_IN_CPYTHON + 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_COMPILING_IN_CPYTHON + 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; +} + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON + 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; +} + +#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 + +#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) { +#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); + } + } + 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 + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { +#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 + +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); +} + +#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; + py_frame->f_lineno = py_line; + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +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); + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +#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;\ + } + +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" +#endif + +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)) + } 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)) + } + } 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) 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)) + } else if (sizeof(PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +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); + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +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)) + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } 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) 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)) + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +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)) + } 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)) + } + } 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) 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)) + } 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)) + } + } + { +#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_Int(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_Int(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; +} + +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); + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + 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); + } +} + +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)) + } else if (sizeof(npy_uint32) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } 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) 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)) + } else if (sizeof(npy_uint32) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(npy_uint32, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +static CYTHON_INLINE long __Pyx_pow_long(long b, long e) { + long t = b; + switch (e) { + case 3: + t *= b; + case 2: + t *= b; + case 1: + return t; + case 0: + return 1; + } + #if 1 + if (unlikely(e<0)) return 0; + #endif + t = 1; + while (likely(e)) { + t *= (b * (e&1)) | ((~e)&1); + b *= b; + e >>= 1; + } + return t; +} + +#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 + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eqf(__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_sumf(__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_difff(__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_prodf(__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; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__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_zerof(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__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_absf(__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_powf(__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_prodf(a, a); + return __Pyx_c_prodf(a, a); + case 3: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, a); + case 4: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_absf(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 + +#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 + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq(__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(__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(__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(__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; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__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(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__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(__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(__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(a, a); + return __Pyx_c_prod(a, a); + case 3: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, a); + case 4: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_abs(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 + +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); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + 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); + } +} + +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)) + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } 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) 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)) + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#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_Int(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_Int(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; +} + +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; +} + +static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig) { + PyObject *d; + PyObject *cobj = 0; + d = PyDict_GetItem(__pyx_d, __pyx_n_s_pyx_capi); + Py_XINCREF(d); + if (!d) { + d = PyDict_New(); + if (!d) + goto bad; + if (__Pyx_PyObject_SetAttrStr(__pyx_m, __pyx_n_s_pyx_capi, d) < 0) + goto bad; + } +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(p, sig, 0); +#else + cobj = PyCObject_FromVoidPtrAndDesc(p, (void *)sig, 0); +#endif + if (!cobj) + goto bad; + if (PyDict_SetItem(d, name, cobj) < 0) + goto bad; + Py_DECREF(cobj); + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(cobj); + Py_XDECREF(d); + return -1; +} + +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { + PyObject *d = 0; + PyObject *cobj = 0; + union { + void (*fp)(void); + void *p; + } tmp; + d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__"); + if (!d) { + PyErr_Clear(); + d = PyDict_New(); + if (!d) + goto bad; + Py_INCREF(d); + if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0) + goto bad; + } + tmp.fp = f; +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(tmp.p, sig, 0); +#else + cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0); +#endif + if (!cobj) + goto bad; + if (PyDict_SetItemString(d, name, cobj) < 0) + goto bad; + Py_DECREF(cobj); + Py_DECREF(d); + return 0; +bad: + Py_XDECREF(cobj); + Py_XDECREF(d); + return -1; +} + +#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 + +#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", + module_name, class_name); + 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", + module_name, class_name); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +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_Int(PyObject* x) { + PyNumberMethods *m; + 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); + 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 + 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/syntax_model_files/gensim/models/word2vec_inner.pxd b/syntax_model_files/gensim/models/word2vec_inner.pxd new file mode 100644 index 0000000000..0f7bb91e2c --- /dev/null +++ b/syntax_model_files/gensim/models/word2vec_inner.pxd @@ -0,0 +1,54 @@ +# +# shared type definitions for word2vec_inner +# used by both word2vec_inner.pyx (automatically) and doc2vec_inner.pyx (by explicit cimport) +# +# Copyright (C) 2013 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.htmlcimport numpy as np + +cdef extern from "voidptr.h": + void* PyCObject_AsVoidPtr(object obj) + +cimport numpy as np +ctypedef np.float32_t REAL_t + +# 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 +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 +cdef saxpy_ptr saxpy +cdef sdot_ptr sdot +cdef dsdot_ptr dsdot +cdef snrm2_ptr snrm2 +cdef sscal_ptr sscal + +# precalculated sigmoid table +DEF EXP_TABLE_SIZE = 1000 +DEF MAX_EXP = 6 +cdef REAL_t[EXP_TABLE_SIZE] EXP_TABLE + +# 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 +cdef our_saxpy_ptr our_saxpy + +# 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 + +# 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 + +# 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 +cdef void our_saxpy_noblas(const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY) nogil + +# to support random draws from negative-sampling cum_table +cdef 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 random_int32(unsigned long long *next_random) nogil \ No newline at end of file diff --git a/syntax_model_files/gensim/models/word2vec_inner.pyx b/syntax_model_files/gensim/models/word2vec_inner.pyx new file mode 100644 index 0000000000..549f168094 --- /dev/null +++ b/syntax_model_files/gensim/models/word2vec_inner.pyx @@ -0,0 +1,725 @@ +#!/usr/bin/env cython +# cython: boundscheck=False +# cython: wraparound=False +# cython: cdivision=True +# coding: utf-8 +# +# Copyright (C) 2013 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + +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 + +REAL = np.float32 + +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) +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 +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 + +# 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 +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 +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 + cdef int i + cdef REAL_t a + a = 0.0 + for i from 0 <= i < N[0] by 1: + a += X[i] * Y[i] + return a + +# 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 + for i from 0 <= i < N[0] by 1: + Y[i * (incY[0])] = (alpha[0]) * X[i * (incX[0])] + Y[i * (incY[0])] + + +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, + const np.uint32_t word2_index, const REAL_t alpha, REAL_t *work, REAL_t *word_locks) nogil: + + cdef long long a, b + cdef long long row1 = word2_index * size, row2 + cdef REAL_t f, g + + memset(work, 0, size * cython.sizeof(REAL_t)) + for b in range(codelen): + row2 = word_point[b] * size + f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1[row2], &ONE) + our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &ONE) + + +# 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 + while hi > lo: + mid = (lo + hi) >> 1 + if a[mid] >= x: + hi = mid + else: + lo = mid + 1 + return lo + +# this quick & dirty RNG apparently matches Java's (non-Secure)Random +# note this function side-effects next_random to set up the next number +cdef inline unsigned long long random_int32(unsigned long long *next_random) nogil: + 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( + 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, + const np.uint32_t word2_index, const REAL_t alpha, REAL_t *work, + unsigned long long next_random, REAL_t *word_locks) nogil: + + cdef long long a + cdef long long row1 = word2_index * size, row2 + cdef unsigned long long modulo = 281474976710655ULL + cdef REAL_t f, g, label + cdef np.uint32_t target_index + cdef int d + + 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 = our_dot(&size, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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, &syn0[row1], &ONE, &syn1neg[row2], &ONE) + + our_saxpy(&size, &word_locks[word2_index], work, &ONE, &syn0[row1], &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, REAL_t *syn1, const int size, + const np.uint32_t indexes[MAX_SENTENCE_LEN], const REAL_t alpha, REAL_t *work, + int i, int j, int k, int cbow_mean, REAL_t *word_locks) nogil: + + cdef long long a, b + cdef long long row2 + cdef REAL_t f, g, count, inv_count = 1.0 + cdef int m + + memset(neu1, 0, size * cython.sizeof(REAL_t)) + count = 0.0 + for m in range(j, k): + if m == i: + continue + else: + count += ONEF + our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + if count > (0.5): + 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)) + for b in range(codelens[i]): + row2 = word_point[b] * size + f = our_dot(&size, neu1, &ONE, &syn1[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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) # (does this need BLAS-variants like saxpy?) + + for m in range(j, k): + if m == i: + continue + else: + our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m] * 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, REAL_t *syn1neg, const int size, + const np.uint32_t indexes[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) 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 + 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 + else: + count += ONEF + our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + if count > (0.5): + 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)) + + 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 = our_dot(&size, neu1, &ONE, &syn1neg[row2], &ONE) + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = EXP_TABLE[((f + 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) # (does this need BLAS-variants like saxpy?) + + for m in range(j,k): + if m == i: + continue + else: + our_saxpy(&size, &word_locks[indexes[m]], work, &ONE, &syn0[indexes[m]*size], &ONE) + + return next_random + + +def train_batch_sg(model, sentences, alpha, _work): + cdef int hs = model.hs + cdef int negative = model.negative + cdef int sample = (model.sample != 0) + cdef int sc = model.synt_cont + + cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_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 + + 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) + + # prepare C structures so we can go "full C" and release the Python GIL + vlookup = model.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 + 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 # TODO: log warning, tally overflow? + + # 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[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + if negative: + next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + if sc: + i = idx_start + j = idx_start + k = idx_end + for j in range(j, k): + if j == i: + continue + if hs: + fast_sentence_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], _alpha, work, word_locks) + if negative: + next_random = fast_sentence_sg_neg(negative, cum_table, cum_table_len, syn0, syn1neg, size, indexes[i], indexes[j], _alpha, work, next_random, word_locks) + + 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 int sc = model.synt_cont + + cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *word_locks = (np.PyArray_DATA(model.syn0_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 + + 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.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 + 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 # TODO: log warning, tally overflow? + + # 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, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + if negative: + next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + if sc: + i = idx_start + j = idx_start + k = idx_end + if hs: + fast_sentence_cbow_hs(points[i], codes[i], codelens, neu1, syn0, syn1, size, indexes, _alpha, work, i, j, k, cbow_mean, word_locks) + if negative: + next_random = fast_sentence_cbow_neg(negative, cum_table, cum_table_len, codelens, neu1, syn0, syn1neg, size, indexes, _alpha, work, i, j, k, cbow_mean, next_random, word_locks) + + return effective_words + + +# Score is only implemented for hierarchical softmax +def score_sentence_sg(model, sentence, _work): + + cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *work + cdef int size = model.layer1_size + cdef int sc = model.synt_cont + + cdef int codelens[MAX_SENTENCE_LEN] + cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + cdef int sentence_len + cdef int window = model.window + + cdef int i, j, k + cdef long result = 0 + + cdef REAL_t *syn1 + cdef np.uint32_t *points[MAX_SENTENCE_LEN] + 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 + work = np.PyArray_DATA(_work) + + vlookup = model.vocab + i = 0 + for token in sentence: + word = vlookup[token] if token in vlookup else None + if word is None: + continue # should drop the + indexes[i] = word.index + codelens[i] = len(word.code) + codes[i] = np.PyArray_DATA(word.code) + points[i] = np.PyArray_DATA(word.point) + result += 1 + i += 1 + if i == MAX_SENTENCE_LEN: + break # TODO: log warning, tally overflow? + sentence_len = i + + # release GIL & train on the sentence + work[0] = 0.0 + + with nogil: + if not sc: + for i in range(sentence_len): + if codelens[i] == 0: + continue + j = i - window + if j < 0: + j = 0 + k = i + window + 1 + if k > sentence_len: + k = sentence_len + for j in range(j, k): + if j == i or codelens[j] == 0: + continue + score_pair_sg_hs(points[i], codes[i], codelens[i], syn0, syn1, size, indexes[j], work) + if sc: + i = 0 + if codelens[i] == 0: + pass + else: + j = 0 + k = sentence_len + for j in range(j, k): + 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] + +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, + const np.uint32_t word2_index, REAL_t *work) nogil: + + cdef long long b + cdef long long row1 = word2_index * size, row2, sgn + cdef REAL_t f + + for b in range(codelen): + row2 = word_point[b] * size + f = our_dot(&size, &syn0[row1], &ONE, &syn1[row2], &ONE) + sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + f = sgn*f + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + work[0] += f + +def score_sentence_cbow(model, sentence, _work, _neu1): + + cdef int cbow_mean = model.cbow_mean + cdef int sc = model.synt_cont + + cdef REAL_t *syn0 = (np.PyArray_DATA(model.syn0)) + cdef REAL_t *work + cdef REAL_t *neu1 + cdef int size = model.layer1_size + + cdef int codelens[MAX_SENTENCE_LEN] + cdef np.uint32_t indexes[MAX_SENTENCE_LEN] + cdef int sentence_len + cdef int window = model.window + + cdef int i, j, k + cdef long result = 0 + + # For hierarchical softmax + cdef REAL_t *syn1 + cdef np.uint32_t *points[MAX_SENTENCE_LEN] + 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 + work = np.PyArray_DATA(_work) + neu1 = np.PyArray_DATA(_neu1) + + vlookup = model.vocab + i = 0 + for token in sentence: + word = vlookup[token] if token in vlookup else None + if word is None: + continue # for score, should this be a default negative value? + indexes[i] = word.index + codelens[i] = len(word.code) + codes[i] = np.PyArray_DATA(word.code) + points[i] = np.PyArray_DATA(word.point) + result += 1 + i += 1 + if i == MAX_SENTENCE_LEN: + break # TODO: log warning, tally overflow? + sentence_len = i + + # release GIL & train on the sentence + work[0] = 0.0 + with nogil: + if not sc: + for i in range(sentence_len): + if codelens[i] == 0: + continue + j = i - window + if j < 0: + j = 0 + k = i + window + 1 + 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) + if sc: + i = 0 + if codelens[i] == 0: + pass + else: + j = 0 + 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] + +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, + const np.uint32_t indexes[MAX_SENTENCE_LEN], REAL_t *work, + int i, int j, int k, int cbow_mean) nogil: + + cdef long long a, b + cdef long long row2 + cdef REAL_t f, g, count, inv_count, sgn + cdef int m + + memset(neu1, 0, size * cython.sizeof(REAL_t)) + count = 0.0 + for m in range(j, k): + if m == i or codelens[m] == 0: + continue + else: + count += ONEF + our_saxpy(&size, &ONEF, &syn0[indexes[m] * size], &ONE, neu1, &ONE) + if count > (0.5): + inv_count = ONEF/count + if cbow_mean: + 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) + sgn = (-1)**word_code[b] # ch function: 0-> 1, 1 -> -1 + f = sgn*f + if f <= -MAX_EXP or f >= MAX_EXP: + continue + f = LOG_TABLE[((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2))] + work[0] += f + + +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/syntax_model_files/script_to_model.py b/syntax_model_files/script_to_model.py index 005603138e..391a9264d4 100644 --- a/syntax_model_files/script_to_model.py +++ b/syntax_model_files/script_to_model.py @@ -83,8 +83,10 @@ def __iter__(self): # synt_cash = ContIterable()) sentences = ContIterable() -from gensim.models import word2vec_synt +from gensim.models import word2vec +# Add synt_cont=1 to word2vec call if syntax-based context +print('Dont forget to add synt_cont=1 if you want so!') print("Training model...") -model = word2vec_synt.Word2Vec(sentences, workers=num_workers, \ +model = word2vec.Word2Vec(sentences, workers=num_workers, \ size=num_features, min_count = min_word_count, \ window = context, sample = downsampling, sg = 1) From 498474d3ddd4c796839927fba14c2fa25cf89ee7 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Thu, 15 Dec 2016 15:52:31 +0100 Subject: [PATCH 31/33] Evaluation function to measure model correlation with human similarity judgments datasets. --- gensim/models/word2vec.py | 839 ++++++++++++++++++++++++++++---------- 1 file changed, 623 insertions(+), 216 deletions(-) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index f82905bdc6..6f4ef62de8 100644 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -79,7 +79,6 @@ import itertools from gensim.utils import keep_vocab_item -from gensim.models.keyedvectors import KeyedVectors try: from queue import Queue, Empty @@ -88,26 +87,25 @@ from numpy import exp, log, dot, zeros, outer, random, dtype, float32 as REAL,\ double, uint32, seterr, array, uint8, vstack, fromstring, sqrt, newaxis,\ - ndarray, empty, sum as np_sum, prod, ones, ascontiguousarray, vstack, logaddexp - -from scipy.special import expit - -from scipy.special import expit + ndarray, empty, sum as np_sum, prod, ones, ascontiguousarray, vstack from gensim import utils, matutils # utility fnc for pickling, common scipy operations etc from gensim.corpora.dictionary import Dictionary from six import iteritems, itervalues, string_types from six.moves import xrange from types import GeneratorType +from scipy import stats logger = logging.getLogger(__name__) + try: from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH except ImportError: # failed... fall back to plain numpy (20-80x slower training than the above) + # Can't log here because logger is usually not configured at import time FAST_VERSION = -1 MAX_WORDS_IN_BATCH = 10000 @@ -124,8 +122,8 @@ 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] + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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 @@ -134,7 +132,7 @@ def train_batch_sg(model, sentences, alpha, work=None): for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): # don't train on the `word` itself if pos2 != pos: - train_sg_pair(model, model.wv.index2word[word.index], word2.index, alpha) + train_sg_pair(model, model.index2word[word.index], word2.index, alpha) result += len(word_vocabs) return result @@ -151,14 +149,14 @@ 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] + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and + model.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 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)] - l1 = np_sum(model.wv.syn0[word2_indices], axis=0) # 1 x vector_size + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size if word2_indices and model.cbow_mean: l1 /= len(word2_indices) train_cbow_pair(model, word, word2_indices, l1, alpha) @@ -181,7 +179,7 @@ def score_sentence_sg(model, sentence, work=None): if model.negative: raise RuntimeError("scoring is only available for HS=True") - word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab] + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] for pos, word in enumerate(word_vocabs): if word is None: continue # OOV word in the input sentence => skip @@ -210,7 +208,7 @@ def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): if model.negative: raise RuntimeError("scoring is only available for HS=True") - word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab] + word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] for pos, word in enumerate(word_vocabs): if word is None: continue # OOV word in the input sentence => skip @@ -218,24 +216,31 @@ def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): start = max(0, pos - model.window) window_pos = enumerate(word_vocabs[start:(pos + model.window + 1)], start) word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] - l1 = np_sum(model.wv.syn0[word2_indices], axis=0) # 1 x layer1_size + l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x layer1_size if word2_indices and model.cbow_mean: l1 /= len(word2_indices) log_prob_sentence += score_cbow_pair(model, word, word2_indices, l1) return log_prob_sentence +# If pyemd C extension is available, import it. +# If pyemd is attempted to be used, but isn't installed, ImportError will be raised. +try: + from pyemd import emd + PYEMD_EXT = True +except ImportError: + PYEMD_EXT = False def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_hidden=True, context_vectors=None, context_locks=None): if context_vectors is None: - context_vectors = model.wv.syn0 + context_vectors = model.syn0 if context_locks is None: context_locks = model.syn0_lockf - if word not in model.wv.vocab: + if word not in model.vocab: return - predict_word = model.wv.vocab[word] # target word (NN output) + predict_word = model.vocab[word] # target word (NN output) l1 = context_vectors[context_index] # input word (NN input/projection layer) lock_factor = context_locks[context_index] @@ -245,7 +250,7 @@ def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_h if model.hs: # work on the entire tree at once, to push as much work into numpy's C routines as possible (performance) l2a = deepcopy(model.syn1[predict_word.point]) # 2d matrix, codelen x layer1_size - fa = expit(dot(l1, l2a.T)) # propagate hidden -> output + fa = 1.0 / (1.0 + exp(-dot(l1, l2a.T))) # propagate hidden -> output ga = (1 - predict_word.code - fa) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1[predict_word.point] += outer(ga, l1) # learn hidden -> output @@ -259,23 +264,30 @@ def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_h if w != predict_word.index: word_indices.append(w) l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size - fb = expit(dot(l1, l2b.T)) # propagate hidden -> output + fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output neu1e += dot(gb, l2b) # save error if learn_vectors: - l1 += neu1e * lock_factor # learn input -> hidden (mutates model.wv.syn0[word2.index], if that is l1) + l1 += neu1e * lock_factor # learn input -> hidden (mutates model.syn0[word2.index], if that is l1) return neu1e +def sigmoid(p): + if p > 0: + return 1. / (1. + exp(-p)) + elif p <= 0: + return exp(p) / (1 + exp(p)) + else: + raise ValueError def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=True, learn_hidden=True): neu1e = zeros(l1.shape) if model.hs: l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size - fa = expit(dot(l1, l2a.T)) # propagate hidden -> output + fa = 1. / (1. + exp(-dot(l1, l2a.T))) # propagate hidden -> output ga = (1. - word.code - fa) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1[word.point] += outer(ga, l1) # learn hidden -> output @@ -289,7 +301,7 @@ def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=Tr if w != word.index: word_indices.append(w) l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size - fb = expit(dot(l1, l2b.T)) # propagate hidden -> output + fb = sigmoid(dot(l1, l2b.T)) # propagate hidden -> output gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output @@ -300,23 +312,23 @@ def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=Tr if not model.cbow_mean and input_word_indices: neu1e /= len(input_word_indices) for i in input_word_indices: - model.wv.syn0[i] += neu1e * model.syn0_lockf[i] + model.syn0[i] += neu1e * model.syn0_lockf[i] return neu1e def score_sg_pair(model, word, word2): - l1 = model.wv.syn0[word2.index] + l1 = model.syn0[word2.index] l2a = deepcopy(model.syn1[word.point]) # 2d matrix, codelen x layer1_size sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1 - lprob = -logaddexp(0, -sgn * dot(l1, l2a.T)) + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) return sum(lprob) def score_cbow_pair(model, word, word2_indices, l1): l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1 - lprob = -logaddexp(0, -sgn * dot(l1, l2a.T)) + lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) return sum(lprob) @@ -420,13 +432,14 @@ def __init__( texts are longer than 10000 words, but the standard cython code truncates to that maximum.) """ - + if FAST_VERSION == -1: logger.warning('Slow version of {0} is being used'.format(__name__)) else: logger.debug('Fast version of {0} is being used'.format(__name__)) - self.wv = KeyedVectors() # wv --> KeyedVectors + self.vocab = {} # mapping from a word (string) to a Vocab object + self.index2word = [] # map from a word's matrix index (int) to word (string) self.sg = int(sg) self.cum_table = None # for negative sampling self.vector_size = int(size) @@ -453,7 +466,7 @@ def __init__( self.total_train_time = 0 self.sorted_vocab = sorted_vocab self.batch_words = batch_words - self.model_trimmed_post_training = False + if sentences is not None: if isinstance(sentences, GeneratorType): raise TypeError("You can't pass a generator as the sentences argument. Try an iterator.") @@ -472,13 +485,13 @@ def make_cum_table(self, power=0.75, domain=2**31 - 1): Called internally from 'build_vocab()'. """ - vocab_size = len(self.wv.index2word) + vocab_size = len(self.index2word) self.cum_table = zeros(vocab_size, dtype=uint32) # compute sum of all power (Z in paper) - train_words_pow = float(sum([self.wv.vocab[word].count**power for word in self.wv.vocab])) + train_words_pow = float(sum([self.vocab[word].count**power for word in self.vocab])) cumulative = 0.0 for word_index in range(vocab_size): - cumulative += self.wv.vocab[self.wv.index2word[word_index]].count**power + cumulative += self.vocab[self.index2word[word_index]].count**power self.cum_table[word_index] = round(cumulative / train_words_pow * domain) if len(self.cum_table) > 0: assert self.cum_table[-1] == domain @@ -489,27 +502,27 @@ def create_binary_tree(self): will have shorter binary codes. Called internally from `build_vocab()`. """ - logger.info("constructing a huffman tree from %i words", len(self.wv.vocab)) + logger.info("constructing a huffman tree from %i words", len(self.vocab)) # build the huffman tree - heap = list(itervalues(self.wv.vocab)) + heap = list(itervalues(self.vocab)) heapq.heapify(heap) - for i in xrange(len(self.wv.vocab) - 1): + for i in xrange(len(self.vocab) - 1): min1, min2 = heapq.heappop(heap), heapq.heappop(heap) - heapq.heappush(heap, Vocab(count=min1.count + min2.count, index=i + len(self.wv.vocab), left=min1, right=min2)) + heapq.heappush(heap, Vocab(count=min1.count + min2.count, index=i + len(self.vocab), left=min1, right=min2)) # recurse over the tree, assigning a binary code to each vocabulary word if heap: max_depth, stack = 0, [(heap[0], [], [])] while stack: node, codes, points = stack.pop() - if node.index < len(self.wv.vocab): + if node.index < len(self.vocab): # leaf node => store its path from the root node.code, node.point = codes, points max_depth = max(len(codes), max_depth) else: # inner node => continue recursion - points = array(list(points) + [node.index - len(self.wv.vocab)], dtype=uint32) + points = array(list(points) + [node.index - len(self.vocab)], dtype=uint32) stack.append((node.left, array(list(codes) + [0], dtype=uint8), points)) stack.append((node.right, array(list(codes) + [1], dtype=uint8), points)) @@ -578,19 +591,19 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab retain_total, retain_words = 0, [] # Discard words less-frequent than min_count if not dry_run: - self.wv.index2word = [] + self.index2word = [] # make stored settings match these applied settings self.min_count = min_count self.sample = sample - self.wv.vocab = {} + self.vocab = {} for word, v in iteritems(self.raw_vocab): if keep_vocab_item(word, v, min_count, trim_rule=trim_rule): retain_words.append(word) retain_total += v if not dry_run: - self.wv.vocab[word] = Vocab(count=v, index=len(self.wv.index2word)) - self.wv.index2word.append(word) + self.vocab[word] = Vocab(count=v, index=len(self.index2word)) + self.index2word.append(word) else: drop_unique += 1 drop_total += v @@ -608,17 +621,17 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab new_words = pre_exist_words = [] for word, v in iteritems(self.raw_vocab): if keep_vocab_item(word, v, min_count, trim_rule=trim_rule): - if word in self.wv.vocab: + if word in self.vocab: pre_exist_words.append(word) pre_exist_total += v if not dry_run: - self.wv.vocab[word].count += v + self.vocab[word].count += v else: new_words.append(word) new_total += v if not dry_run: - self.wv.vocab[word] = Vocab(count=v, index=len(self.wv.index2word)) - self.wv.index2word.append(word) + self.vocab[word] = Vocab(count=v, index=len(self.index2word)) + self.index2word.append(word) else: drop_unique += 1 drop_total += v @@ -654,7 +667,7 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab word_probability = 1.0 downsample_total += v if not dry_run: - self.wv.vocab[w].sample_int = int(round(word_probability * 2**32)) + self.vocab[w].sample_int = int(round(word_probability * 2**32)) if not dry_run and not keep_raw_vocab: logger.info("deleting the raw counts dictionary of %i items", len(self.raw_vocab)) @@ -675,7 +688,7 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab def finalize_vocab(self, update=False): """Build tables and model weights based on final vocabulary settings.""" - if not self.wv.index2word: + if not self.index2word: self.scale_vocab() if self.sorted_vocab and not update: self.sort_vocab() @@ -689,9 +702,9 @@ def finalize_vocab(self, update=False): # create null pseudo-word for padding when using concatenative L1 (run-of-words) # this word is only ever input – never predicted – so count, huffman-point, etc doesn't matter word, v = '\0', Vocab(count=1, sample_int=0) - v.index = len(self.wv.vocab) - self.wv.index2word.append(word) - self.wv.vocab[word] = v + v.index = len(self.vocab) + self.index2word.append(word) + self.vocab[word] = v # set initial input/projection and hidden weights if not update: self.reset_weights() @@ -700,19 +713,19 @@ def finalize_vocab(self, update=False): def sort_vocab(self): """Sort the vocabulary so the most frequent words have the lowest indexes.""" - if len(self.wv.syn0): + if hasattr(self, 'syn0'): raise RuntimeError("must sort before initializing vectors/weights") - self.wv.index2word.sort(key=lambda word: self.wv.vocab[word].count, reverse=True) - for i, word in enumerate(self.wv.index2word): - self.wv.vocab[word].index = i + self.index2word.sort(key=lambda word: self.vocab[word].count, reverse=True) + for i, word in enumerate(self.index2word): + self.vocab[word].index = i def reset_from(self, other_model): """ Borrow shareable pre-built structures (like vocab) from the other_model. Useful if testing multiple models in parallel on the same corpus. """ - self.wv.vocab = other_model.vocab - self.wv.index2word = other_model.index2word + self.vocab = other_model.vocab + self.index2word = other_model.index2word self.cum_table = other_model.cum_table self.corpus_count = other_model.corpus_count self.reset_weights() @@ -745,8 +758,6 @@ def train(self, sentences, total_words=None, word_count=0, sentences are the same as those that were used to initially build the vocabulary. """ - if (self.model_trimmed_post_training): - raise RuntimeError("Parameters for training were discarded using model_trimmed_post_training method") if FAST_VERSION < 0: import warnings warnings.warn("C extension not loaded for Word2Vec, training will be slow. " @@ -760,12 +771,12 @@ def train(self, sentences, total_words=None, word_count=0, logger.info( "training model with %i workers on %i vocabulary and %i features, " "using sg=%s hs=%s sample=%s negative=%s window=%s", - self.workers, len(self.wv.vocab), self.layer1_size, self.sg, + self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative, self.window) - if not self.wv.vocab: + if not self.vocab: raise RuntimeError("you must first build vocabulary before training the model") - if not len(self.wv.syn0): + if not hasattr(self, 'syn0'): raise RuntimeError("you must first finalize vocabulary before training the model") if total_words is None and total_examples is None: @@ -952,9 +963,9 @@ def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor logger.info( "scoring sentences with %i workers on %i vocabulary and %i features, " "using sg=%s hs=%s sample=%s and negative=%s", - self.workers, len(self.wv.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) + self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) - if not self.wv.vocab: + if not self.vocab: raise RuntimeError("you must first build vocabulary before scoring new data") if not self.hs: @@ -1041,7 +1052,7 @@ def worker_loop(): return sentence_scores[:sentence_count] def clear_sims(self): - self.wv.syn0norm = None + self.syn0norm = None def update_weights(self): """ @@ -1049,39 +1060,39 @@ def update_weights(self): added vocabulary. """ logger.info("updating layer weights") - gained_vocab = len(self.wv.vocab) - len(self.wv.syn0) + gained_vocab = len(self.vocab) - len(self.syn0) newsyn0 = empty((gained_vocab, self.vector_size), dtype=REAL) # randomize the remaining words - for i in xrange(len(self.wv.syn0), len(self.wv.vocab)): + for i in xrange(len(self.syn0), len(self.vocab)): # construct deterministic seed from word AND seed argument - newsyn0[i-len(self.wv.syn0)] = self.seeded_vector(self.wv.index2word[i] + str(self.seed)) - self.wv.syn0 = vstack([self.wv.syn0, newsyn0]) + newsyn0[i-len(self.syn0)] = self.seeded_vector(self.index2word[i] + str(self.seed)) + self.syn0 = vstack([self.syn0, newsyn0]) if self.hs: self.syn1 = vstack([self.syn1, zeros((gained_vocab, self.layer1_size), dtype=REAL)]) if self.negative: self.syn1neg = vstack([self.syn1neg, zeros((gained_vocab, self.layer1_size), dtype=REAL)]) - self.wv.syn0norm = None + self.syn0norm = None # do not suppress learning for already learned words - self.syn0_lockf = ones(len(self.wv.vocab), dtype=REAL) # zeros suppress learning + self.syn0_lockf = ones(len(self.vocab), dtype=REAL) # zeros suppress learning def reset_weights(self): """Reset all projection weights to an initial (untrained) state, but keep the existing vocabulary.""" logger.info("resetting layer weights") - self.wv.syn0 = empty((len(self.wv.vocab), self.vector_size), dtype=REAL) + self.syn0 = empty((len(self.vocab), self.vector_size), dtype=REAL) # randomize weights vector by vector, rather than materializing a huge random matrix in RAM at once - for i in xrange(len(self.wv.vocab)): + for i in xrange(len(self.vocab)): # construct deterministic seed from word AND seed argument - self.wv.syn0[i] = self.seeded_vector(self.wv.index2word[i] + str(self.seed)) + self.syn0[i] = self.seeded_vector(self.index2word[i] + str(self.seed)) if self.hs: - self.syn1 = zeros((len(self.wv.vocab), self.layer1_size), dtype=REAL) + self.syn1 = zeros((len(self.vocab), self.layer1_size), dtype=REAL) if self.negative: - self.syn1neg = zeros((len(self.wv.vocab), self.layer1_size), dtype=REAL) - self.wv.syn0norm = None + self.syn1neg = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + self.syn0norm = None - self.syn0_lockf = ones(len(self.wv.vocab), dtype=REAL) # zeros suppress learning + self.syn0_lockf = ones(len(self.vocab), dtype=REAL) # zeros suppress learning def seeded_vector(self, seed_string): """Create one 'random' vector (but deterministic by seed_string)""" @@ -1103,15 +1114,15 @@ def save_word2vec_format(self, fname, fvocab=None, binary=False): if fvocab is not None: logger.info("storing vocabulary in %s" % (fvocab)) with utils.smart_open(fvocab, 'wb') as vout: - for word, vocab in sorted(iteritems(self.wv.vocab), key=lambda item: -item[1].count): + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): vout.write(utils.to_utf8("%s %s\n" % (word, vocab.count))) - logger.info("storing %sx%s projection weights into %s" % (len(self.wv.vocab), self.vector_size, fname)) - assert (len(self.wv.vocab), self.vector_size) == self.wv.syn0.shape + logger.info("storing %sx%s projection weights into %s" % (len(self.vocab), self.vector_size, fname)) + assert (len(self.vocab), self.vector_size) == self.syn0.shape with utils.smart_open(fname, 'wb') as fout: - fout.write(utils.to_utf8("%s %s\n" % self.wv.syn0.shape)) + fout.write(utils.to_utf8("%s %s\n" % self.syn0.shape)) # store in sorted order: most frequent words at the top - for word, vocab in sorted(iteritems(self.wv.vocab), key=lambda item: -item[1].count): - row = self.wv.syn0[vocab.index] + for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + row = self.syn0[vocab.index] if binary: fout.write(utils.to_utf8(word) + b" " + row.tostring()) else: @@ -1164,25 +1175,25 @@ def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', if limit: vocab_size = min(vocab_size, limit) result = cls(size=vector_size) - result.wv.syn0 = zeros((vocab_size, vector_size), dtype=datatype) + result.syn0 = zeros((vocab_size, vector_size), dtype=datatype) def add_word(word, weights): - word_id = len(result.wv.vocab) - if word in result.wv.vocab: + word_id = len(result.vocab) + if word in result.vocab: logger.warning("duplicate word '%s' in %s, ignoring all but first", word, fname) return if counts is None: # most common scenario: no vocab file given. just make up some bogus counts, in descending order - result.wv.vocab[word] = Vocab(index=word_id, count=vocab_size - word_id) + result.vocab[word] = Vocab(index=word_id, count=vocab_size - word_id) elif word in counts: # use count from the vocab file - result.wv.vocab[word] = Vocab(index=word_id, count=counts[word]) + result.vocab[word] = Vocab(index=word_id, count=counts[word]) else: # vocab file given, but word is missing -- set count to None (TODO: or raise?) logger.warning("vocabulary file is incomplete: '%s' is missing", word) - result.wv.vocab[word] = Vocab(index=word_id, count=None) - result.wv.syn0[word_id] = weights - result.wv.index2word.append(word) + result.vocab[word] = Vocab(index=word_id, count=None) + result.syn0[word_id] = weights + result.index2word.append(word) if binary: binary_len = dtype(REAL).itemsize * vector_size @@ -1210,15 +1221,15 @@ def add_word(word, weights): raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) word, weights = parts[0], list(map(REAL, parts[1:])) add_word(word, weights) - if result.wv.syn0.shape[0] != len(result.wv.vocab): + if result.syn0.shape[0] != len(result.vocab): logger.info( "duplicate words detected, shrinking matrix size from %i to %i", - result.wv.syn0.shape[0], len(result.wv.vocab) + result.syn0.shape[0], len(result.vocab) ) - result.wv.syn0 = ascontiguousarray(result.wv.syn0[: len(result.wv.vocab)]) - assert (len(result.wv.vocab), result.vector_size) == result.wv.syn0.shape + result.syn0 = ascontiguousarray(result.syn0[: len(result.vocab)]) + assert (len(result.vocab), result.vector_size) == result.syn0.shape - logger.info("loaded %s matrix from %s" % (result.wv.syn0.shape, fname)) + logger.info("loaded %s matrix from %s" % (result.syn0.shape, fname)) return result def intersect_word2vec_format(self, fname, lockf=0.0, binary=False, encoding='utf8', unicode_errors='strict'): @@ -1255,123 +1266,387 @@ def intersect_word2vec_format(self, fname, lockf=0.0, binary=False, encoding='ut word.append(ch) word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) weights = fromstring(fin.read(binary_len), dtype=REAL) - if word in self.wv.vocab: + if word in self.vocab: overlap_count += 1 - self.wv.syn0[self.wv.vocab[word].index] = weights - self.syn0_lockf[self.wv.vocab[word].index] = lockf # lock-factor: 0.0 stops further changes + self.syn0[self.vocab[word].index] = weights + self.syn0_lockf[self.vocab[word].index] = lockf # lock-factor: 0.0 stops further changes else: for line_no, line in enumerate(fin): parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") if len(parts) != vector_size + 1: raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) word, weights = parts[0], list(map(REAL, parts[1:])) - if word in self.wv.vocab: + if word in self.vocab: overlap_count += 1 - self.wv.syn0[self.wv.vocab[word].index] = weights - logger.info("merged %d vectors into %s matrix from %s" % (overlap_count, self.wv.syn0.shape, fname)) + self.syn0[self.vocab[word].index] = weights + logger.info("merged %d vectors into %s matrix from %s" % (overlap_count, self.syn0.shape, fname)) def most_similar(self, positive=[], negative=[], topn=10, restrict_vocab=None, indexer=None): - return self.wv.most_similar(positive, negative, topn, restrict_vocab, indexer) + """ + Find the top-N most similar words. Positive words contribute positively towards the + similarity, negative words negatively. + + This method computes cosine similarity between a simple mean of the projection + weight vectors of the given words and the vectors for each word in the model. + The method corresponds to the `word-analogy` and `distance` scripts in the original + word2vec implementation. + + If topn is False, most_similar 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.most_similar(positive=['woman', 'king'], negative=['man']) + [('queen', 0.50882536), ...] + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar('dog'), as a shorthand for most_similar(['dog']) + positive = [positive] + + # add weights for each word, if not already present; default to 1.0 for positive and -1.0 for negative words + positive = [ + (word, 1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in positive + ] + negative = [ + (word, -1.0) if isinstance(word, string_types + (ndarray,)) else word + for word in negative + ] + + # compute the weighted average of all words + all_words, mean = set(), [] + for word, weight in positive + negative: + if isinstance(word, ndarray): + mean.append(weight * word) + elif word in self.vocab: + mean.append(weight * self.syn0norm[self.vocab[word].index]) + all_words.add(self.vocab[word].index) + else: + raise KeyError("word '%s' not in vocabulary" % word) + if not mean: + raise ValueError("cannot compute similarity with no input") + mean = matutils.unitvec(array(mean).mean(axis=0)).astype(REAL) + + if indexer is not None: + return indexer.most_similar(mean, topn) + + limited = self.syn0norm if restrict_vocab is None else self.syn0norm[:restrict_vocab] + dists = dot(limited, mean) + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] + return result[:topn] def wmdistance(self, document1, document2): - return self.wv.wmdistance(document1, document2) + """ + Compute the Word Mover's Distance between two documents. When using this + code, please consider citing the following papers: + + .. Ofir Pele and Michael Werman, "A linear time histogram metric for improved SIFT matching". + .. Ofir Pele and Michael Werman, "Fast and robust earth mover's distances". + .. Matt Kusner et al. "From Word Embeddings To Document Distances". + + Note that if one of the documents have no words that exist in the + Word2Vec vocab, `float('inf')` (i.e. infinity) will be returned. + + This method only works if `pyemd` is installed (can be installed via pip, but requires a C compiler). + + Example: + >>> # Train word2vec model. + >>> model = Word2Vec(sentences) + + >>> # Some sentences to test. + >>> sentence_obama = 'Obama speaks to the media in Illinois'.lower().split() + >>> sentence_president = 'The president greets the press in Chicago'.lower().split() + + >>> # Remove their stopwords. + >>> from nltk.corpus import stopwords + >>> stopwords = nltk.corpus.stopwords.words('english') + >>> sentence_obama = [w for w in sentence_obama if w not in stopwords] + >>> sentence_president = [w for w in sentence_president if w not in stopwords] + + >>> # Compute WMD. + >>> distance = model.wmdistance(sentence_obama, sentence_president) + """ + + if not PYEMD_EXT: + raise ImportError("Please install pyemd Python package to compute WMD.") + + # Remove out-of-vocabulary words. + len_pre_oov1 = len(document1) + len_pre_oov2 = len(document2) + document1 = [token for token in document1 if token in self] + document2 = [token for token in document2 if token in self] + diff1 = len_pre_oov1 - len(document1) + diff2 = len_pre_oov2 - len(document2) + if diff1 > 0 or diff2 > 0: + logger.info('Removed %d and %d OOV words from document 1 and 2 (respectively).', + diff1, diff2) + + if len(document1) == 0 or len(document2) == 0: + logger.info('At least one of the documents had no words that were' + 'in the vocabulary. Aborting (returning inf).') + return float('inf') + + dictionary = Dictionary(documents=[document1, document2]) + vocab_len = len(dictionary) + + # Sets for faster look-up. + docset1 = set(document1) + docset2 = set(document2) + + # Compute distance matrix. + distance_matrix = zeros((vocab_len, vocab_len), dtype=double) + for i, t1 in dictionary.items(): + for j, t2 in dictionary.items(): + if not t1 in docset1 or not t2 in docset2: + continue + # Compute Euclidean distance between word vectors. + distance_matrix[i, j] = sqrt(np_sum((self[t1] - self[t2])**2)) + + if np_sum(distance_matrix) == 0.0: + # `emd` gets stuck if the distance matrix contains only zeros. + logger.info('The distance matrix is all zeros. Aborting (returning inf).') + return float('inf') + + def nbow(document): + d = zeros(vocab_len, dtype=double) + nbow = dictionary.doc2bow(document) # Word frequencies. + doc_len = len(document) + for idx, freq in nbow: + d[idx] = freq / float(doc_len) # Normalized word frequencies. + return d + + # Compute nBOW representation of documents. + d1 = nbow(document1) + d2 = nbow(document2) + + # Compute WMD. + return emd(d1, d2, distance_matrix) def most_similar_cosmul(self, positive=[], negative=[], topn=10): - return self.wv.most_similar_cosmul(positive, negative, topn) + """ + Find the top-N most similar words, using the multiplicative combination objective + proposed by Omer Levy and Yoav Goldberg in [4]_. Positive words still contribute + positively towards the similarity, negative words negatively, but with less + susceptibility to one large distance dominating the calculation. + + In the common analogy-solving case, of two positive and one negative examples, + this method is equivalent to the "3CosMul" objective (equation (4)) of Levy and Goldberg. + + Additional positive or negative examples contribute to the numerator or denominator, + respectively – a potentially sensible but untested extension of the method. (With + a single positive example, rankings will be the same as in the default most_similar.) + + Example:: + + >>> trained_model.most_similar_cosmul(positive=['baghdad', 'england'], negative=['london']) + [(u'iraq', 0.8488819003105164), ...] + + .. [4] Omer Levy and Yoav Goldberg. Linguistic Regularities in Sparse and Explicit Word Representations, 2014. + + """ + self.init_sims() + + if isinstance(positive, string_types) and not negative: + # allow calls like most_similar_cosmul('dog'), as a shorthand for most_similar_cosmul(['dog']) + positive = [positive] + + all_words = set() + + def word_vec(word): + if isinstance(word, ndarray): + return word + elif word in self.vocab: + all_words.add(self.vocab[word].index) + return self.syn0norm[self.vocab[word].index] + else: + raise KeyError("word '%s' not in vocabulary" % word) + + positive = [word_vec(word) for word in positive] + negative = [word_vec(word) for word in negative] + if not positive: + raise ValueError("cannot compute similarity with no input") + + # equation (4) of Levy & Goldberg "Linguistic Regularities...", + # with distances shifted to [0,1] per footnote (7) + pos_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in positive] + neg_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in negative] + dists = prod(pos_dists, axis=0) / (prod(neg_dists, axis=0) + 0.000001) + + if not topn: + return dists + best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) + # ignore (don't return) words from the input + 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): - return self.wv.similar_by_word(word, topn, restrict_vocab) + """ + 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): - return self.wv.similar_by_vector(vector, topn, restrict_vocab) + """ + 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): - return self.wv.doesnt_match(words) + """ + Which word from the given list doesn't go with the others? + + Example:: + + >>> trained_model.doesnt_match("breakfast cereal dinner lunch".split()) + 'cereal' + + """ + self.init_sims() + + words = [word for word in words if word in self.vocab] # filter out OOV words + logger.debug("using words %s" % words) + if not words: + raise ValueError("cannot select a word from an empty list") + vectors = vstack(self.syn0norm[self.vocab[word].index] for word in words).astype(REAL) + mean = matutils.unitvec(vectors.mean(axis=0)).astype(REAL) + dists = dot(vectors, mean) + return sorted(zip(dists, words))[0][1] def __getitem__(self, words): - return self.wv.__getitem__(words) - - @property - def syn0norm(self): - logger.warning('direct access to syn0norm will not be supported in future gensim releases, please use model.wv.syn0norm') - return self.wv.syn0norm - - @syn0norm.setter - def syn0norm(self, value): - logger.warning('direct access to syn0norm will not be supported in future gensim releases, please use model.wv.syn0norm') - self.wv.syn0norm = value - - @syn0norm.deleter - def syn0norm(self): - logger.warning('direct access to syn0norm will not be supported in future gensim releases, please use model.wv.syn0norm') - del self.wv.syn0norm - - @property - def syn0(self): - logger.warning('direct access to syn0 will not be supported in future gensim releases, please use model.wv.syn0') - return self.wv.syn0 - - @syn0.setter - def syn0(self, value): - logger.warning('direct access to syn0 will not be supported in future gensim releases, please use model.wv.syn0') - self.wv.syn0 = value - - @syn0.deleter - def syn0(self): - logger.warning('direct access to syn0 will not be supported in future gensim releases, please use model.wv.syn0') - del self.wv.syn0 - - @property - def vocab(self): - logger.warning('direct access to vocab will not be supported in future gensim releases, please use model.wv.vocab') - return self.wv.vocab - - @vocab.setter - def vocab(self, value): - logger.warning('direct access to vocab will not be supported in future gensim releases, please use model.wv.vocab') - self.wv.vocab = value - - @vocab.deleter - def vocab(self): - logger.warning('direct access to vocab will not be supported in future gensim releases, please use model.wv.vocab') - del self.wv.vocab - - @property - def index2word(self): - logger.warning('direct access to index2word will not be supported in future gensim releases, please use model.wv.index2word') - return self.wv.index2word - - @index2word.setter - def index2word(self, value): - logger.warning('direct access to index2word will not be supported in future gensim releases, please use model.wv.index2word') - self.wv.index2word = value - - @index2word.deleter - def index2word(self): - logger.warning('direct access to index2word will not be supported in future gensim releases, please use model.wv.index2word') - del self.wv.index2word + + """ + 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.syn0[self.vocab[words].index] + + return vstack([self.syn0[self.vocab[word].index] for word in words]) def __contains__(self, word): - return self.wv.__contains__(word) + return word in self.vocab def similarity(self, w1, w2): - return self.wv.similarity(w1, w2) + """ + Compute cosine similarity between two words. + + Example:: + + >>> trained_model.similarity('woman', 'man') + 0.73723527 + + >>> trained_model.similarity('woman', 'woman') + 1.0 + + """ + return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2])) def n_similarity(self, ws1, ws2): - return self.wv.n_similarity(ws1, ws2) + """ + Compute cosine similarity between two sets of words. + + Example:: + + >>> trained_model.n_similarity(['sushi', 'shop'], ['japanese', 'restaurant']) + 0.61540466561049689 + + >>> trained_model.n_similarity(['restaurant', 'japanese'], ['japanese', 'restaurant']) + 1.0000000000000004 + + >>> trained_model.n_similarity(['sushi'], ['restaurant']) == trained_model.similarity('sushi', 'restaurant') + True + + """ + if not(len(ws1) and len(ws2)): + raise ZeroDivisionError('Atleast one of the passed list is empty.') + v1 = [self[word] for word in ws1] + v2 = [self[word] for word in ws2] + return dot(matutils.unitvec(array(v1).mean(axis=0)), + matutils.unitvec(array(v2).mean(axis=0))) + def init_sims(self, replace=False): """ - init_sims() resides in KeyedVectors because it deals with syn0 mainly, but because syn1 is not an attribute - of KeyedVectors, it has to be deleted in this class, and the normalizing of syn0 happens inside of KeyedVectors + Precompute L2-normalized vectors. + + If `replace` is set, forget the original vectors and only keep the normalized + ones = saves lots of memory! + + Note that you **cannot continue training** after doing a replace. The model becomes + effectively read-only = you can call `most_similar`, `similarity` etc., but not `train`. + """ - if replace and hasattr(self, 'syn1'): - del self.syn1 - return self.wv.init_sims(replace) + if getattr(self, 'syn0norm', None) is None or replace: + logger.info("precomputing L2-norms of word weight vectors") + if replace: + for i in xrange(self.syn0.shape[0]): + self.syn0[i, :] /= sqrt((self.syn0[i, :] ** 2).sum(-1)) + self.syn0norm = self.syn0 + if hasattr(self, 'syn1'): + del self.syn1 + else: + self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL) def estimate_memory(self, vocab_size=None, report=None): """Estimate required memory for a model using current settings and provided vocabulary size.""" - vocab_size = vocab_size or len(self.wv.vocab) + vocab_size = vocab_size or len(self.vocab) report = report or {} report['vocab'] = vocab_size * (700 if self.hs else 500) report['syn0'] = vocab_size * self.vector_size * dtype(REAL).itemsize @@ -1386,38 +1661,180 @@ def estimate_memory(self, vocab_size=None, report=None): @staticmethod def log_accuracy(section): - return KeyedVectors.log_accuracy(section) + correct, incorrect = len(section['correct']), len(section['incorrect']) + if correct + incorrect > 0: + logger.info("%s: %.1f%% (%i/%i)" % + (section['section'], 100.0 * correct / (correct + incorrect), + correct, correct + incorrect)) - def accuracy(self, questions, restrict_vocab=30000, most_similar=None, case_insensitive=True): - most_similar = most_similar or KeyedVectors.most_similar - return self.wv.accuracy(questions, restrict_vocab, most_similar, case_insensitive) + def accuracy(self, questions, restrict_vocab=30000, most_similar=most_similar, case_insensitive=True): + """ + Compute accuracy of the model. `questions` is a filename where lines are + 4-tuples of words, split into sections by ": SECTION NAME" lines. + See questions-words.txt in https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/word2vec/source-archive.zip for an example. + + The accuracy is reported (=printed to log and returned as a list) for each + section separately, plus there's one aggregate summary at the end. + + Use `restrict_vocab` to ignore all questions containing a word not in the first `restrict_vocab` + words (default 30,000). This may be meaningful if you've sorted the vocabulary by descending frequency. + In case `case_insensitive` is True, the first `restrict_vocab` words are taken first, and then + case normalization is performed. + + Use `case_insensitive` to convert all words in questions and vocab to their uppercase form before + evaluating the accuracy (default True). Useful in case of case-mismatch between training tokens + and question words. In case of multiple case variants of a single word, the vector for the first + occurrence (also the most frequent if vocabulary is sorted) is taken. + + This method corresponds to the `compute-accuracy` script of the original C word2vec. - def __str__(self): - return "%s(vocab=%s, size=%s, alpha=%s)" % (self.__class__.__name__, len(self.wv.index2word), self.vector_size, self.alpha) - - def _minimize_model(self, save_syn1 = False, save_syn1neg = False, save_syn0_lockf = False): - if hasattr(self, 'syn1') and not save_syn1: - del self.syn1 - if hasattr(self, 'syn1neg') and not save_syn1neg: - del self.syn1neg - if hasattr(self, 'syn0_lockf') and not save_syn0_lockf: - del self.syn0_lockf - self.model_trimmed_post_training = True - - def delete_temporary_training_data(self, replace_word_vectors_with_normalized=False): """ - Discard parameters that are used in training and score. Use if you're sure you're done training a model. - If `replace_word_vectors_with_normalized` is set, forget the original vectors and only keep the normalized - ones = saves lots of memory! + ok_vocab = [(w, self.vocab[w]) for w in self.index2word[:restrict_vocab]] + ok_vocab = dict((w.upper(), v) for w, v in reversed(ok_vocab)) if case_insensitive else dict(ok_vocab) + + sections, section = [], None + for line_no, line in enumerate(utils.smart_open(questions)): + # TODO: use level3 BLAS (=evaluate multiple questions at once), for speed + line = utils.to_unicode(line) + if line.startswith(': '): + # a new section starts => store the old section + if section: + sections.append(section) + self.log_accuracy(section) + section = {'section': line.lstrip(': ').strip(), 'correct': [], 'incorrect': []} + else: + if not section: + raise ValueError("missing section header before line #%i in %s" % (line_no, questions)) + try: + if case_insensitive: + a, b, c, expected = [word.upper() for word in line.split()] + else: + a, b, c, expected = [word for word in line.split()] + except: + logger.info("skipping invalid line #%i in %s" % (line_no, questions)) + continue + if a not in ok_vocab or b not in ok_vocab or c not in ok_vocab or expected not in ok_vocab: + logger.debug("skipping line #%i with OOV words: %s" % (line_no, line.strip())) + continue + + original_vocab = self.vocab + self.vocab = ok_vocab + ignore = set([a, b, c]) # input words to be ignored + predicted = None + # find the most likely prediction, ignoring OOV words and input words + sims = most_similar(self, positive=[b, c], negative=[a], topn=False, restrict_vocab=restrict_vocab) + self.vocab = original_vocab + for index in matutils.argsort(sims, reverse=True): + predicted = self.index2word[index].upper() if case_insensitive else self.index2word[index] + if predicted in ok_vocab and predicted not in ignore: + if predicted != expected: + logger.debug("%s: expected %s, predicted %s", line.strip(), expected, predicted) + break + if predicted == expected: + section['correct'].append((a, b, c, expected)) + else: + section['incorrect'].append((a, b, c, expected)) + if section: + # store the last section, too + sections.append(section) + self.log_accuracy(section) + + total = { + 'section': 'total', + 'correct': sum((s['correct'] for s in sections), []), + 'incorrect': sum((s['incorrect'] for s in sections), []), + } + self.log_accuracy(total) + sections.append(total) + return sections + + @staticmethod + def log_evaluation(pearson, spearman, oov, pairs): + logger.info('Pearson correlation coefficient against {0:s}: {1:.4f}'.format(pairs, pearson[0])) + logger.info('Spearman rank-order correlation coefficient against {0:s}: {1:.4f}'.format(pairs, spearman[0])) + logger.info('Pairs with unknown words ratio: {0:.1f}%'.format(oov)) + + + def evaluation(self, pairs, delimiter='\t', restrict_vocab=300000, case_insensitive=True, dummy4unknown=False): + """ + Compute correlation of the model with human similarity judgments. `pairs` is a filename of a dataset where + lines are 3-tuples, each consisting of a word pair and a similarity value, separated by `delimiter'. + Example datasets can be found at http://technion.ac.il/~ira.leviant/wordsim353.zip or at + https://www.cl.cam.ac.uk/~fh295/SimLex-999.zip. + + The model is evaluated using Pearson correlation coefficient and Spearman rank-order correlation coefficient + between the similarities from the dataset and the similarities produced by the model itself. . + The results are printed to log and returned as a triple (pearson, spearman, ratio of pairs with unknown words). + + Use `restrict_vocab` to ignore all word pairs containing a word not in the first `restrict_vocab` + words (default 300,000). This may be meaningful if you've sorted the vocabulary by descending frequency. + If `case_insensitive` is True, the first `restrict_vocab` words are taken, and then case normalization + is performed. + + Use `case_insensitive` to convert all words in the pairs and vocab to their uppercase form before + evaluating the model (default True). Useful when you expect case-mismatch between training tokens + and words pairs in the dataset. If there are multiple case variants of a single word, the vector for the first + occurrence (also the most frequent if vocabulary is sorted) is taken. + + Use `dummy4unknown=True' to produce zero-valued similarities for pairs with out-of-vocabulary words. + Otherwise (default False), these pairs are skipped entirely. """ - if replace_word_vectors_with_normalized: - self.init_sims(replace=True) - self._minimize_model() + ok_vocab = [(w, self.vocab[w]) for w in self.index2word[:restrict_vocab]] + ok_vocab = dict((w.upper(), v) for w, v in reversed(ok_vocab)) if case_insensitive else dict(ok_vocab) + + similarity_gold = [] + similarity_model = [] + oov = 0 + + original_vocab = self.vocab + self.vocab = ok_vocab + + for line_no, line in enumerate(utils.smart_open(pairs)): + line = utils.to_unicode(line) + if line.startswith('#'): + # May be a comment + continue + else: + try: + if case_insensitive: + a, b, sim = [word.upper() for word in line.split(delimiter)] + else: + a, b, sim = [word for word in line.split(delimiter)] + sim = float(sim) + except: + logger.info('skipping invalid line #{0:d} in {1:s}'.format(line_no, pairs)) + continue + if a not in ok_vocab or b not in ok_vocab: + oov += 1 + if dummy4unknown: + similarity_model.append(0.0) + similarity_gold.append(sim) + continue + else: + logger.debug('skipping line #{0:d} with OOV words: {1:s}'.format(line_no, line.strip())) + continue + similarity_gold.append(sim) # Similarity from the dataset + similarity_model.append(self.similarity(a,b)) # Similarity from the model + self.vocab = original_vocab + spearman = stats.spearmanr(similarity_gold, similarity_model) + pearson = stats.pearsonr(similarity_gold, similarity_model) + oov_ratio = float(oov)/(len(similarity_gold)+oov)*100 + + logger.debug('Pearson correlation coefficient against {0:s}: {1:f} with p-value {2:f}' + .format(pairs, pearson[0], pearson[1])) + logger.debug('Spearman rank-order correlation coefficient against {0:s}: {1:f} with p-value {2:f}' + .format(pairs, spearman[0], spearman[1])) + logger.debug('Pairs with unknown words: {0:d}'.format(oov)) + self.log_evaluation(pearson, spearman, oov_ratio, pairs) + return pearson, spearman, oov_ratio + + + def __str__(self): + return "%s(vocab=%s, size=%s, alpha=%s)" % (self.__class__.__name__, len(self.index2word), self.vector_size, self.alpha) def save(self, *args, **kwargs): # don't bother storing the cached normalized vectors, recalculable table kwargs['ignore'] = kwargs.get('ignore', ['syn0norm', 'table', 'cum_table']) - super(Word2Vec, self).save(*args, **kwargs) save.__doc__ = utils.SaveLoad.save.__doc__ @@ -1432,14 +1849,14 @@ def load(cls, *args, **kwargs): model.make_cum_table() # rebuild cum_table from vocabulary if not hasattr(model, 'corpus_count'): model.corpus_count = None - for v in model.wv.vocab.values(): + for v in model.vocab.values(): if hasattr(v, 'sample_int'): break # already 0.12.0+ style int probabilities elif hasattr(v, 'sample_probability'): v.sample_int = int(round(v.sample_probability * 2**32)) del v.sample_probability if not hasattr(model, 'syn0_lockf') and hasattr(model, 'syn0'): - model.syn0_lockf = ones(len(model.wv.syn0), dtype=REAL) + model.syn0_lockf = ones(len(model.syn0), dtype=REAL) if not hasattr(model, 'random'): model.random = random.RandomState(model.seed) if not hasattr(model, 'train_count'): @@ -1447,15 +1864,6 @@ def load(cls, *args, **kwargs): model.total_train_time = 0 return model - def _load_specials(self, *args, **kwargs): - # loading from a pre-KeyedVectors word2vec model - if not hasattr(self, 'wv'): - wv = KeyedVectors() - wv.syn0 = self.__dict__.get('syn0', []) - wv.vocab = self.__dict__.get('vocab', {}) - wv.index2word = self.__dict__.get('index2word', []) - self.wv = wv - super(Word2Vec, self)._load_specials(*args, **kwargs) class BrownCorpus(object): """Iterate over sentences from the Brown corpus (part of NLTK data).""" @@ -1617,4 +2025,3 @@ def __iter__(self): model.accuracy(args.accuracy) logger.info("finished running %s", program) - From ce64d5a0a567b93c22d2137e3c98cf63bafc2ed6 Mon Sep 17 00:00:00 2001 From: akutuzov Date: Thu, 15 Dec 2016 16:21:54 +0100 Subject: [PATCH 32/33] Updating semantic similarity evaluation. --- gensim/models/keyedvectors.py | 80 ++++ gensim/models/word2vec.py | 838 +++++++++------------------------- 2 files changed, 299 insertions(+), 619 deletions(-) diff --git a/gensim/models/keyedvectors.py b/gensim/models/keyedvectors.py index d0558e7737..d29ebf8fc6 100644 --- a/gensim/models/keyedvectors.py +++ b/gensim/models/keyedvectors.py @@ -478,6 +478,86 @@ def accuracy(self, questions, restrict_vocab=30000, most_similar=most_similar, c sections.append(total) return sections + @staticmethod + def log_evaluation(pearson, spearman, oov, pairs): + logger.info('Pearson correlation coefficient against {0:s}: {1:.4f}'.format(pairs, pearson[0])) + logger.info('Spearman rank-order correlation coefficient against {0:s}: {1:.4f}'.format(pairs, spearman[0])) + logger.info('Pairs with unknown words ratio: {0:.1f}%'.format(oov)) + + def evaluation(self, pairs, delimiter='\t', restrict_vocab=300000, case_insensitive=True, dummy4unknown=False): + """ + Compute correlation of the model with human similarity judgments. `pairs` is a filename of a dataset where + lines are 3-tuples, each consisting of a word pair and a similarity value, separated by `delimiter'. + Example datasets can be found at http://technion.ac.il/~ira.leviant/wordsim353.zip or at + https://www.cl.cam.ac.uk/~fh295/SimLex-999.zip. + + The model is evaluated using Pearson correlation coefficient and Spearman rank-order correlation coefficient + between the similarities from the dataset and the similarities produced by the model itself. . + The results are printed to log and returned as a triple (pearson, spearman, ratio of pairs with unknown words). + + Use `restrict_vocab` to ignore all word pairs containing a word not in the first `restrict_vocab` + words (default 300,000). This may be meaningful if you've sorted the vocabulary by descending frequency. + If `case_insensitive` is True, the first `restrict_vocab` words are taken, and then case normalization + is performed. + + Use `case_insensitive` to convert all words in the pairs and vocab to their uppercase form before + evaluating the model (default True). Useful when you expect case-mismatch between training tokens + and words pairs in the dataset. If there are multiple case variants of a single word, the vector for the first + occurrence (also the most frequent if vocabulary is sorted) is taken. + + Use `dummy4unknown=True' to produce zero-valued similarities for pairs with out-of-vocabulary words. + Otherwise (default False), these pairs are skipped entirely. + """ + ok_vocab = [(w, self.vocab[w]) for w in self.index2word[:restrict_vocab]] + ok_vocab = dict((w.upper(), v) for w, v in reversed(ok_vocab)) if case_insensitive else dict(ok_vocab) + + similarity_gold = [] + similarity_model = [] + oov = 0 + + original_vocab = self.vocab + self.vocab = ok_vocab + + for line_no, line in enumerate(utils.smart_open(pairs)): + line = utils.to_unicode(line) + if line.startswith('#'): + # May be a comment + continue + else: + try: + if case_insensitive: + a, b, sim = [word.upper() for word in line.split(delimiter)] + else: + a, b, sim = [word for word in line.split(delimiter)] + sim = float(sim) + except: + logger.info('skipping invalid line #{0:d} in {1:s}'.format(line_no, pairs)) + continue + if a not in ok_vocab or b not in ok_vocab: + oov += 1 + if dummy4unknown: + similarity_model.append(0.0) + similarity_gold.append(sim) + continue + else: + logger.debug('skipping line #{0:d} with OOV words: {1:s}'.format(line_no, line.strip())) + continue + similarity_gold.append(sim) # Similarity from the dataset + similarity_model.append(self.similarity(a, b)) # Similarity from the model + self.vocab = original_vocab + spearman = stats.spearmanr(similarity_gold, similarity_model) + pearson = stats.pearsonr(similarity_gold, similarity_model) + oov_ratio = float(oov) / (len(similarity_gold) + oov) * 100 + + logger.debug('Pearson correlation coefficient against {0:s}: {1:f} with p-value {2:f}' + .format(pairs, pearson[0], pearson[1])) + logger.debug('Spearman rank-order correlation coefficient against {0:s}: {1:f} with p-value {2:f}' + .format(pairs, spearman[0], spearman[1])) + logger.debug('Pairs with unknown words: {0:d}'.format(oov)) + self.log_evaluation(pearson, spearman, oov_ratio, pairs) + return pearson, spearman, oov_ratio + + def init_sims(self, replace=False): """ Precompute L2-normalized vectors. diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 6f4ef62de8..432beef0c4 100644 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -79,6 +79,7 @@ import itertools from gensim.utils import keep_vocab_item +from gensim.models.keyedvectors import KeyedVectors try: from queue import Queue, Empty @@ -87,25 +88,26 @@ from numpy import exp, log, dot, zeros, outer, random, dtype, float32 as REAL,\ double, uint32, seterr, array, uint8, vstack, fromstring, sqrt, newaxis,\ - ndarray, empty, sum as np_sum, prod, ones, ascontiguousarray, vstack + ndarray, empty, sum as np_sum, prod, ones, ascontiguousarray, vstack, logaddexp + +from scipy.special import expit + +from scipy.special import expit from gensim import utils, matutils # utility fnc for pickling, common scipy operations etc from gensim.corpora.dictionary import Dictionary from six import iteritems, itervalues, string_types from six.moves import xrange from types import GeneratorType -from scipy import stats logger = logging.getLogger(__name__) - try: from gensim.models.word2vec_inner import train_batch_sg, train_batch_cbow from gensim.models.word2vec_inner import score_sentence_sg, score_sentence_cbow from gensim.models.word2vec_inner import FAST_VERSION, MAX_WORDS_IN_BATCH except ImportError: # failed... fall back to plain numpy (20-80x slower training than the above) - # Can't log here because logger is usually not configured at import time FAST_VERSION = -1 MAX_WORDS_IN_BATCH = 10000 @@ -122,8 +124,8 @@ def train_batch_sg(model, sentences, alpha, work=None): """ result = 0 for sentence in sentences: - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and - model.vocab[w].sample_int > model.random.rand() * 2**32] + 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 @@ -132,7 +134,7 @@ def train_batch_sg(model, sentences, alpha, work=None): for pos2, word2 in enumerate(word_vocabs[start:(pos + model.window + 1 - reduced_window)], start): # don't train on the `word` itself if pos2 != pos: - train_sg_pair(model, model.index2word[word.index], word2.index, alpha) + train_sg_pair(model, model.wv.index2word[word.index], word2.index, alpha) result += len(word_vocabs) return result @@ -149,14 +151,14 @@ def train_batch_cbow(model, sentences, alpha, work=None, neu1=None): """ result = 0 for sentence in sentences: - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab and - model.vocab[w].sample_int > model.random.rand() * 2**32] + 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 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)] - l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x vector_size + l1 = np_sum(model.wv.syn0[word2_indices], axis=0) # 1 x vector_size if word2_indices and model.cbow_mean: l1 /= len(word2_indices) train_cbow_pair(model, word, word2_indices, l1, alpha) @@ -179,7 +181,7 @@ def score_sentence_sg(model, sentence, work=None): if model.negative: raise RuntimeError("scoring is only available for HS=True") - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab] for pos, word in enumerate(word_vocabs): if word is None: continue # OOV word in the input sentence => skip @@ -208,7 +210,7 @@ def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): if model.negative: raise RuntimeError("scoring is only available for HS=True") - word_vocabs = [model.vocab[w] for w in sentence if w in model.vocab] + word_vocabs = [model.wv.vocab[w] for w in sentence if w in model.wv.vocab] for pos, word in enumerate(word_vocabs): if word is None: continue # OOV word in the input sentence => skip @@ -216,31 +218,24 @@ def score_sentence_cbow(model, sentence, alpha, work=None, neu1=None): start = max(0, pos - model.window) window_pos = enumerate(word_vocabs[start:(pos + model.window + 1)], start) word2_indices = [word2.index for pos2, word2 in window_pos if (word2 is not None and pos2 != pos)] - l1 = np_sum(model.syn0[word2_indices], axis=0) # 1 x layer1_size + l1 = np_sum(model.wv.syn0[word2_indices], axis=0) # 1 x layer1_size if word2_indices and model.cbow_mean: l1 /= len(word2_indices) log_prob_sentence += score_cbow_pair(model, word, word2_indices, l1) return log_prob_sentence -# If pyemd C extension is available, import it. -# If pyemd is attempted to be used, but isn't installed, ImportError will be raised. -try: - from pyemd import emd - PYEMD_EXT = True -except ImportError: - PYEMD_EXT = False def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_hidden=True, context_vectors=None, context_locks=None): if context_vectors is None: - context_vectors = model.syn0 + context_vectors = model.wv.syn0 if context_locks is None: context_locks = model.syn0_lockf - if word not in model.vocab: + if word not in model.wv.vocab: return - predict_word = model.vocab[word] # target word (NN output) + predict_word = model.wv.vocab[word] # target word (NN output) l1 = context_vectors[context_index] # input word (NN input/projection layer) lock_factor = context_locks[context_index] @@ -250,7 +245,7 @@ def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_h if model.hs: # work on the entire tree at once, to push as much work into numpy's C routines as possible (performance) l2a = deepcopy(model.syn1[predict_word.point]) # 2d matrix, codelen x layer1_size - fa = 1.0 / (1.0 + exp(-dot(l1, l2a.T))) # propagate hidden -> output + fa = expit(dot(l1, l2a.T)) # propagate hidden -> output ga = (1 - predict_word.code - fa) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1[predict_word.point] += outer(ga, l1) # learn hidden -> output @@ -264,30 +259,23 @@ def train_sg_pair(model, word, context_index, alpha, learn_vectors=True, learn_h if w != predict_word.index: word_indices.append(w) l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size - fb = 1. / (1. + exp(-dot(l1, l2b.T))) # propagate hidden -> output + fb = expit(dot(l1, l2b.T)) # propagate hidden -> output gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output neu1e += dot(gb, l2b) # save error if learn_vectors: - l1 += neu1e * lock_factor # learn input -> hidden (mutates model.syn0[word2.index], if that is l1) + l1 += neu1e * lock_factor # learn input -> hidden (mutates model.wv.syn0[word2.index], if that is l1) return neu1e -def sigmoid(p): - if p > 0: - return 1. / (1. + exp(-p)) - elif p <= 0: - return exp(p) / (1 + exp(p)) - else: - raise ValueError def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=True, learn_hidden=True): neu1e = zeros(l1.shape) if model.hs: l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size - fa = 1. / (1. + exp(-dot(l1, l2a.T))) # propagate hidden -> output + fa = expit(dot(l1, l2a.T)) # propagate hidden -> output ga = (1. - word.code - fa) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1[word.point] += outer(ga, l1) # learn hidden -> output @@ -301,7 +289,7 @@ def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=Tr if w != word.index: word_indices.append(w) l2b = model.syn1neg[word_indices] # 2d matrix, k+1 x layer1_size - fb = sigmoid(dot(l1, l2b.T)) # propagate hidden -> output + fb = expit(dot(l1, l2b.T)) # propagate hidden -> output gb = (model.neg_labels - fb) * alpha # vector of error gradients multiplied by the learning rate if learn_hidden: model.syn1neg[word_indices] += outer(gb, l1) # learn hidden -> output @@ -312,23 +300,23 @@ def train_cbow_pair(model, word, input_word_indices, l1, alpha, learn_vectors=Tr if not model.cbow_mean and input_word_indices: neu1e /= len(input_word_indices) for i in input_word_indices: - model.syn0[i] += neu1e * model.syn0_lockf[i] + model.wv.syn0[i] += neu1e * model.syn0_lockf[i] return neu1e def score_sg_pair(model, word, word2): - l1 = model.syn0[word2.index] + l1 = model.wv.syn0[word2.index] l2a = deepcopy(model.syn1[word.point]) # 2d matrix, codelen x layer1_size sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1 - lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + lprob = -logaddexp(0, -sgn * dot(l1, l2a.T)) return sum(lprob) def score_cbow_pair(model, word, word2_indices, l1): l2a = model.syn1[word.point] # 2d matrix, codelen x layer1_size sgn = (-1.0)**word.code # ch function, 0-> 1, 1 -> -1 - lprob = -log(1.0 + exp(-sgn*dot(l1, l2a.T))) + lprob = -logaddexp(0, -sgn * dot(l1, l2a.T)) return sum(lprob) @@ -432,14 +420,13 @@ def __init__( texts are longer than 10000 words, but the standard cython code truncates to that maximum.) """ - + if FAST_VERSION == -1: logger.warning('Slow version of {0} is being used'.format(__name__)) else: logger.debug('Fast version of {0} is being used'.format(__name__)) - self.vocab = {} # mapping from a word (string) to a Vocab object - self.index2word = [] # map from a word's matrix index (int) to word (string) + self.wv = KeyedVectors() # wv --> KeyedVectors self.sg = int(sg) self.cum_table = None # for negative sampling self.vector_size = int(size) @@ -466,7 +453,7 @@ def __init__( self.total_train_time = 0 self.sorted_vocab = sorted_vocab self.batch_words = batch_words - + self.model_trimmed_post_training = False if sentences is not None: if isinstance(sentences, GeneratorType): raise TypeError("You can't pass a generator as the sentences argument. Try an iterator.") @@ -485,13 +472,13 @@ def make_cum_table(self, power=0.75, domain=2**31 - 1): Called internally from 'build_vocab()'. """ - vocab_size = len(self.index2word) + vocab_size = len(self.wv.index2word) self.cum_table = zeros(vocab_size, dtype=uint32) # compute sum of all power (Z in paper) - train_words_pow = float(sum([self.vocab[word].count**power for word in self.vocab])) + train_words_pow = float(sum([self.wv.vocab[word].count**power for word in self.wv.vocab])) cumulative = 0.0 for word_index in range(vocab_size): - cumulative += self.vocab[self.index2word[word_index]].count**power + cumulative += self.wv.vocab[self.wv.index2word[word_index]].count**power self.cum_table[word_index] = round(cumulative / train_words_pow * domain) if len(self.cum_table) > 0: assert self.cum_table[-1] == domain @@ -502,27 +489,27 @@ def create_binary_tree(self): will have shorter binary codes. Called internally from `build_vocab()`. """ - logger.info("constructing a huffman tree from %i words", len(self.vocab)) + logger.info("constructing a huffman tree from %i words", len(self.wv.vocab)) # build the huffman tree - heap = list(itervalues(self.vocab)) + heap = list(itervalues(self.wv.vocab)) heapq.heapify(heap) - for i in xrange(len(self.vocab) - 1): + for i in xrange(len(self.wv.vocab) - 1): min1, min2 = heapq.heappop(heap), heapq.heappop(heap) - heapq.heappush(heap, Vocab(count=min1.count + min2.count, index=i + len(self.vocab), left=min1, right=min2)) + heapq.heappush(heap, Vocab(count=min1.count + min2.count, index=i + len(self.wv.vocab), left=min1, right=min2)) # recurse over the tree, assigning a binary code to each vocabulary word if heap: max_depth, stack = 0, [(heap[0], [], [])] while stack: node, codes, points = stack.pop() - if node.index < len(self.vocab): + if node.index < len(self.wv.vocab): # leaf node => store its path from the root node.code, node.point = codes, points max_depth = max(len(codes), max_depth) else: # inner node => continue recursion - points = array(list(points) + [node.index - len(self.vocab)], dtype=uint32) + points = array(list(points) + [node.index - len(self.wv.vocab)], dtype=uint32) stack.append((node.left, array(list(codes) + [0], dtype=uint8), points)) stack.append((node.right, array(list(codes) + [1], dtype=uint8), points)) @@ -591,19 +578,19 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab retain_total, retain_words = 0, [] # Discard words less-frequent than min_count if not dry_run: - self.index2word = [] + self.wv.index2word = [] # make stored settings match these applied settings self.min_count = min_count self.sample = sample - self.vocab = {} + self.wv.vocab = {} for word, v in iteritems(self.raw_vocab): if keep_vocab_item(word, v, min_count, trim_rule=trim_rule): retain_words.append(word) retain_total += v if not dry_run: - self.vocab[word] = Vocab(count=v, index=len(self.index2word)) - self.index2word.append(word) + self.wv.vocab[word] = Vocab(count=v, index=len(self.wv.index2word)) + self.wv.index2word.append(word) else: drop_unique += 1 drop_total += v @@ -621,17 +608,17 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab new_words = pre_exist_words = [] for word, v in iteritems(self.raw_vocab): if keep_vocab_item(word, v, min_count, trim_rule=trim_rule): - if word in self.vocab: + if word in self.wv.vocab: pre_exist_words.append(word) pre_exist_total += v if not dry_run: - self.vocab[word].count += v + self.wv.vocab[word].count += v else: new_words.append(word) new_total += v if not dry_run: - self.vocab[word] = Vocab(count=v, index=len(self.index2word)) - self.index2word.append(word) + self.wv.vocab[word] = Vocab(count=v, index=len(self.wv.index2word)) + self.wv.index2word.append(word) else: drop_unique += 1 drop_total += v @@ -667,7 +654,7 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab word_probability = 1.0 downsample_total += v if not dry_run: - self.vocab[w].sample_int = int(round(word_probability * 2**32)) + self.wv.vocab[w].sample_int = int(round(word_probability * 2**32)) if not dry_run and not keep_raw_vocab: logger.info("deleting the raw counts dictionary of %i items", len(self.raw_vocab)) @@ -688,7 +675,7 @@ def scale_vocab(self, min_count=None, sample=None, dry_run=False, keep_raw_vocab def finalize_vocab(self, update=False): """Build tables and model weights based on final vocabulary settings.""" - if not self.index2word: + if not self.wv.index2word: self.scale_vocab() if self.sorted_vocab and not update: self.sort_vocab() @@ -702,9 +689,9 @@ def finalize_vocab(self, update=False): # create null pseudo-word for padding when using concatenative L1 (run-of-words) # this word is only ever input – never predicted – so count, huffman-point, etc doesn't matter word, v = '\0', Vocab(count=1, sample_int=0) - v.index = len(self.vocab) - self.index2word.append(word) - self.vocab[word] = v + v.index = len(self.wv.vocab) + self.wv.index2word.append(word) + self.wv.vocab[word] = v # set initial input/projection and hidden weights if not update: self.reset_weights() @@ -713,19 +700,19 @@ def finalize_vocab(self, update=False): def sort_vocab(self): """Sort the vocabulary so the most frequent words have the lowest indexes.""" - if hasattr(self, 'syn0'): + if len(self.wv.syn0): raise RuntimeError("must sort before initializing vectors/weights") - self.index2word.sort(key=lambda word: self.vocab[word].count, reverse=True) - for i, word in enumerate(self.index2word): - self.vocab[word].index = i + self.wv.index2word.sort(key=lambda word: self.wv.vocab[word].count, reverse=True) + for i, word in enumerate(self.wv.index2word): + self.wv.vocab[word].index = i def reset_from(self, other_model): """ Borrow shareable pre-built structures (like vocab) from the other_model. Useful if testing multiple models in parallel on the same corpus. """ - self.vocab = other_model.vocab - self.index2word = other_model.index2word + self.wv.vocab = other_model.vocab + self.wv.index2word = other_model.index2word self.cum_table = other_model.cum_table self.corpus_count = other_model.corpus_count self.reset_weights() @@ -758,6 +745,8 @@ def train(self, sentences, total_words=None, word_count=0, sentences are the same as those that were used to initially build the vocabulary. """ + if (self.model_trimmed_post_training): + raise RuntimeError("Parameters for training were discarded using model_trimmed_post_training method") if FAST_VERSION < 0: import warnings warnings.warn("C extension not loaded for Word2Vec, training will be slow. " @@ -771,12 +760,12 @@ def train(self, sentences, total_words=None, word_count=0, logger.info( "training model with %i workers on %i vocabulary and %i features, " "using sg=%s hs=%s sample=%s negative=%s window=%s", - self.workers, len(self.vocab), self.layer1_size, self.sg, + self.workers, len(self.wv.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative, self.window) - if not self.vocab: + if not self.wv.vocab: raise RuntimeError("you must first build vocabulary before training the model") - if not hasattr(self, 'syn0'): + if not len(self.wv.syn0): raise RuntimeError("you must first finalize vocabulary before training the model") if total_words is None and total_examples is None: @@ -963,9 +952,9 @@ def score(self, sentences, total_sentences=int(1e6), chunksize=100, queue_factor logger.info( "scoring sentences with %i workers on %i vocabulary and %i features, " "using sg=%s hs=%s sample=%s and negative=%s", - self.workers, len(self.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) + self.workers, len(self.wv.vocab), self.layer1_size, self.sg, self.hs, self.sample, self.negative) - if not self.vocab: + if not self.wv.vocab: raise RuntimeError("you must first build vocabulary before scoring new data") if not self.hs: @@ -1052,7 +1041,7 @@ def worker_loop(): return sentence_scores[:sentence_count] def clear_sims(self): - self.syn0norm = None + self.wv.syn0norm = None def update_weights(self): """ @@ -1060,39 +1049,39 @@ def update_weights(self): added vocabulary. """ logger.info("updating layer weights") - gained_vocab = len(self.vocab) - len(self.syn0) + gained_vocab = len(self.wv.vocab) - len(self.wv.syn0) newsyn0 = empty((gained_vocab, self.vector_size), dtype=REAL) # randomize the remaining words - for i in xrange(len(self.syn0), len(self.vocab)): + for i in xrange(len(self.wv.syn0), len(self.wv.vocab)): # construct deterministic seed from word AND seed argument - newsyn0[i-len(self.syn0)] = self.seeded_vector(self.index2word[i] + str(self.seed)) - self.syn0 = vstack([self.syn0, newsyn0]) + newsyn0[i-len(self.wv.syn0)] = self.seeded_vector(self.wv.index2word[i] + str(self.seed)) + self.wv.syn0 = vstack([self.wv.syn0, newsyn0]) if self.hs: self.syn1 = vstack([self.syn1, zeros((gained_vocab, self.layer1_size), dtype=REAL)]) if self.negative: self.syn1neg = vstack([self.syn1neg, zeros((gained_vocab, self.layer1_size), dtype=REAL)]) - self.syn0norm = None + self.wv.syn0norm = None # do not suppress learning for already learned words - self.syn0_lockf = ones(len(self.vocab), dtype=REAL) # zeros suppress learning + self.syn0_lockf = ones(len(self.wv.vocab), dtype=REAL) # zeros suppress learning def reset_weights(self): """Reset all projection weights to an initial (untrained) state, but keep the existing vocabulary.""" logger.info("resetting layer weights") - self.syn0 = empty((len(self.vocab), self.vector_size), dtype=REAL) + self.wv.syn0 = empty((len(self.wv.vocab), self.vector_size), dtype=REAL) # randomize weights vector by vector, rather than materializing a huge random matrix in RAM at once - for i in xrange(len(self.vocab)): + for i in xrange(len(self.wv.vocab)): # construct deterministic seed from word AND seed argument - self.syn0[i] = self.seeded_vector(self.index2word[i] + str(self.seed)) + self.wv.syn0[i] = self.seeded_vector(self.wv.index2word[i] + str(self.seed)) if self.hs: - self.syn1 = zeros((len(self.vocab), self.layer1_size), dtype=REAL) + self.syn1 = zeros((len(self.wv.vocab), self.layer1_size), dtype=REAL) if self.negative: - self.syn1neg = zeros((len(self.vocab), self.layer1_size), dtype=REAL) - self.syn0norm = None + self.syn1neg = zeros((len(self.wv.vocab), self.layer1_size), dtype=REAL) + self.wv.syn0norm = None - self.syn0_lockf = ones(len(self.vocab), dtype=REAL) # zeros suppress learning + self.syn0_lockf = ones(len(self.wv.vocab), dtype=REAL) # zeros suppress learning def seeded_vector(self, seed_string): """Create one 'random' vector (but deterministic by seed_string)""" @@ -1114,15 +1103,15 @@ def save_word2vec_format(self, fname, fvocab=None, binary=False): if fvocab is not None: logger.info("storing vocabulary in %s" % (fvocab)) with utils.smart_open(fvocab, 'wb') as vout: - for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): + for word, vocab in sorted(iteritems(self.wv.vocab), key=lambda item: -item[1].count): vout.write(utils.to_utf8("%s %s\n" % (word, vocab.count))) - logger.info("storing %sx%s projection weights into %s" % (len(self.vocab), self.vector_size, fname)) - assert (len(self.vocab), self.vector_size) == self.syn0.shape + logger.info("storing %sx%s projection weights into %s" % (len(self.wv.vocab), self.vector_size, fname)) + assert (len(self.wv.vocab), self.vector_size) == self.wv.syn0.shape with utils.smart_open(fname, 'wb') as fout: - fout.write(utils.to_utf8("%s %s\n" % self.syn0.shape)) + fout.write(utils.to_utf8("%s %s\n" % self.wv.syn0.shape)) # store in sorted order: most frequent words at the top - for word, vocab in sorted(iteritems(self.vocab), key=lambda item: -item[1].count): - row = self.syn0[vocab.index] + for word, vocab in sorted(iteritems(self.wv.vocab), key=lambda item: -item[1].count): + row = self.wv.syn0[vocab.index] if binary: fout.write(utils.to_utf8(word) + b" " + row.tostring()) else: @@ -1175,25 +1164,25 @@ def load_word2vec_format(cls, fname, fvocab=None, binary=False, encoding='utf8', if limit: vocab_size = min(vocab_size, limit) result = cls(size=vector_size) - result.syn0 = zeros((vocab_size, vector_size), dtype=datatype) + result.wv.syn0 = zeros((vocab_size, vector_size), dtype=datatype) def add_word(word, weights): - word_id = len(result.vocab) - if word in result.vocab: + word_id = len(result.wv.vocab) + if word in result.wv.vocab: logger.warning("duplicate word '%s' in %s, ignoring all but first", word, fname) return if counts is None: # most common scenario: no vocab file given. just make up some bogus counts, in descending order - result.vocab[word] = Vocab(index=word_id, count=vocab_size - word_id) + result.wv.vocab[word] = Vocab(index=word_id, count=vocab_size - word_id) elif word in counts: # use count from the vocab file - result.vocab[word] = Vocab(index=word_id, count=counts[word]) + result.wv.vocab[word] = Vocab(index=word_id, count=counts[word]) else: # vocab file given, but word is missing -- set count to None (TODO: or raise?) logger.warning("vocabulary file is incomplete: '%s' is missing", word) - result.vocab[word] = Vocab(index=word_id, count=None) - result.syn0[word_id] = weights - result.index2word.append(word) + result.wv.vocab[word] = Vocab(index=word_id, count=None) + result.wv.syn0[word_id] = weights + result.wv.index2word.append(word) if binary: binary_len = dtype(REAL).itemsize * vector_size @@ -1221,15 +1210,15 @@ def add_word(word, weights): raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) word, weights = parts[0], list(map(REAL, parts[1:])) add_word(word, weights) - if result.syn0.shape[0] != len(result.vocab): + if result.wv.syn0.shape[0] != len(result.wv.vocab): logger.info( "duplicate words detected, shrinking matrix size from %i to %i", - result.syn0.shape[0], len(result.vocab) + result.wv.syn0.shape[0], len(result.wv.vocab) ) - result.syn0 = ascontiguousarray(result.syn0[: len(result.vocab)]) - assert (len(result.vocab), result.vector_size) == result.syn0.shape + result.wv.syn0 = ascontiguousarray(result.wv.syn0[: len(result.wv.vocab)]) + assert (len(result.wv.vocab), result.vector_size) == result.wv.syn0.shape - logger.info("loaded %s matrix from %s" % (result.syn0.shape, fname)) + logger.info("loaded %s matrix from %s" % (result.wv.syn0.shape, fname)) return result def intersect_word2vec_format(self, fname, lockf=0.0, binary=False, encoding='utf8', unicode_errors='strict'): @@ -1266,387 +1255,123 @@ def intersect_word2vec_format(self, fname, lockf=0.0, binary=False, encoding='ut word.append(ch) word = utils.to_unicode(b''.join(word), encoding=encoding, errors=unicode_errors) weights = fromstring(fin.read(binary_len), dtype=REAL) - if word in self.vocab: + if word in self.wv.vocab: overlap_count += 1 - self.syn0[self.vocab[word].index] = weights - self.syn0_lockf[self.vocab[word].index] = lockf # lock-factor: 0.0 stops further changes + self.wv.syn0[self.wv.vocab[word].index] = weights + self.syn0_lockf[self.wv.vocab[word].index] = lockf # lock-factor: 0.0 stops further changes else: for line_no, line in enumerate(fin): parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") if len(parts) != vector_size + 1: raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) word, weights = parts[0], list(map(REAL, parts[1:])) - if word in self.vocab: + if word in self.wv.vocab: overlap_count += 1 - self.syn0[self.vocab[word].index] = weights - logger.info("merged %d vectors into %s matrix from %s" % (overlap_count, self.syn0.shape, fname)) + self.wv.syn0[self.wv.vocab[word].index] = weights + logger.info("merged %d vectors into %s matrix from %s" % (overlap_count, self.wv.syn0.shape, fname)) def most_similar(self, positive=[], negative=[], topn=10, restrict_vocab=None, indexer=None): - """ - Find the top-N most similar words. Positive words contribute positively towards the - similarity, negative words negatively. - - This method computes cosine similarity between a simple mean of the projection - weight vectors of the given words and the vectors for each word in the model. - The method corresponds to the `word-analogy` and `distance` scripts in the original - word2vec implementation. - - If topn is False, most_similar 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.most_similar(positive=['woman', 'king'], negative=['man']) - [('queen', 0.50882536), ...] - - """ - self.init_sims() - - if isinstance(positive, string_types) and not negative: - # allow calls like most_similar('dog'), as a shorthand for most_similar(['dog']) - positive = [positive] - - # add weights for each word, if not already present; default to 1.0 for positive and -1.0 for negative words - positive = [ - (word, 1.0) if isinstance(word, string_types + (ndarray,)) else word - for word in positive - ] - negative = [ - (word, -1.0) if isinstance(word, string_types + (ndarray,)) else word - for word in negative - ] - - # compute the weighted average of all words - all_words, mean = set(), [] - for word, weight in positive + negative: - if isinstance(word, ndarray): - mean.append(weight * word) - elif word in self.vocab: - mean.append(weight * self.syn0norm[self.vocab[word].index]) - all_words.add(self.vocab[word].index) - else: - raise KeyError("word '%s' not in vocabulary" % word) - if not mean: - raise ValueError("cannot compute similarity with no input") - mean = matutils.unitvec(array(mean).mean(axis=0)).astype(REAL) - - if indexer is not None: - return indexer.most_similar(mean, topn) - - limited = self.syn0norm if restrict_vocab is None else self.syn0norm[:restrict_vocab] - dists = dot(limited, mean) - if not topn: - return dists - best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) - # ignore (don't return) words from the input - result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] - return result[:topn] + return self.wv.most_similar(positive, negative, topn, restrict_vocab, indexer) def wmdistance(self, document1, document2): - """ - Compute the Word Mover's Distance between two documents. When using this - code, please consider citing the following papers: - - .. Ofir Pele and Michael Werman, "A linear time histogram metric for improved SIFT matching". - .. Ofir Pele and Michael Werman, "Fast and robust earth mover's distances". - .. Matt Kusner et al. "From Word Embeddings To Document Distances". - - Note that if one of the documents have no words that exist in the - Word2Vec vocab, `float('inf')` (i.e. infinity) will be returned. - - This method only works if `pyemd` is installed (can be installed via pip, but requires a C compiler). - - Example: - >>> # Train word2vec model. - >>> model = Word2Vec(sentences) - - >>> # Some sentences to test. - >>> sentence_obama = 'Obama speaks to the media in Illinois'.lower().split() - >>> sentence_president = 'The president greets the press in Chicago'.lower().split() - - >>> # Remove their stopwords. - >>> from nltk.corpus import stopwords - >>> stopwords = nltk.corpus.stopwords.words('english') - >>> sentence_obama = [w for w in sentence_obama if w not in stopwords] - >>> sentence_president = [w for w in sentence_president if w not in stopwords] - - >>> # Compute WMD. - >>> distance = model.wmdistance(sentence_obama, sentence_president) - """ - - if not PYEMD_EXT: - raise ImportError("Please install pyemd Python package to compute WMD.") - - # Remove out-of-vocabulary words. - len_pre_oov1 = len(document1) - len_pre_oov2 = len(document2) - document1 = [token for token in document1 if token in self] - document2 = [token for token in document2 if token in self] - diff1 = len_pre_oov1 - len(document1) - diff2 = len_pre_oov2 - len(document2) - if diff1 > 0 or diff2 > 0: - logger.info('Removed %d and %d OOV words from document 1 and 2 (respectively).', - diff1, diff2) - - if len(document1) == 0 or len(document2) == 0: - logger.info('At least one of the documents had no words that were' - 'in the vocabulary. Aborting (returning inf).') - return float('inf') - - dictionary = Dictionary(documents=[document1, document2]) - vocab_len = len(dictionary) - - # Sets for faster look-up. - docset1 = set(document1) - docset2 = set(document2) - - # Compute distance matrix. - distance_matrix = zeros((vocab_len, vocab_len), dtype=double) - for i, t1 in dictionary.items(): - for j, t2 in dictionary.items(): - if not t1 in docset1 or not t2 in docset2: - continue - # Compute Euclidean distance between word vectors. - distance_matrix[i, j] = sqrt(np_sum((self[t1] - self[t2])**2)) - - if np_sum(distance_matrix) == 0.0: - # `emd` gets stuck if the distance matrix contains only zeros. - logger.info('The distance matrix is all zeros. Aborting (returning inf).') - return float('inf') - - def nbow(document): - d = zeros(vocab_len, dtype=double) - nbow = dictionary.doc2bow(document) # Word frequencies. - doc_len = len(document) - for idx, freq in nbow: - d[idx] = freq / float(doc_len) # Normalized word frequencies. - return d - - # Compute nBOW representation of documents. - d1 = nbow(document1) - d2 = nbow(document2) - - # Compute WMD. - return emd(d1, d2, distance_matrix) + return self.wv.wmdistance(document1, document2) def most_similar_cosmul(self, positive=[], negative=[], topn=10): - """ - Find the top-N most similar words, using the multiplicative combination objective - proposed by Omer Levy and Yoav Goldberg in [4]_. Positive words still contribute - positively towards the similarity, negative words negatively, but with less - susceptibility to one large distance dominating the calculation. - - In the common analogy-solving case, of two positive and one negative examples, - this method is equivalent to the "3CosMul" objective (equation (4)) of Levy and Goldberg. - - Additional positive or negative examples contribute to the numerator or denominator, - respectively – a potentially sensible but untested extension of the method. (With - a single positive example, rankings will be the same as in the default most_similar.) - - Example:: - - >>> trained_model.most_similar_cosmul(positive=['baghdad', 'england'], negative=['london']) - [(u'iraq', 0.8488819003105164), ...] - - .. [4] Omer Levy and Yoav Goldberg. Linguistic Regularities in Sparse and Explicit Word Representations, 2014. - - """ - self.init_sims() - - if isinstance(positive, string_types) and not negative: - # allow calls like most_similar_cosmul('dog'), as a shorthand for most_similar_cosmul(['dog']) - positive = [positive] - - all_words = set() - - def word_vec(word): - if isinstance(word, ndarray): - return word - elif word in self.vocab: - all_words.add(self.vocab[word].index) - return self.syn0norm[self.vocab[word].index] - else: - raise KeyError("word '%s' not in vocabulary" % word) - - positive = [word_vec(word) for word in positive] - negative = [word_vec(word) for word in negative] - if not positive: - raise ValueError("cannot compute similarity with no input") - - # equation (4) of Levy & Goldberg "Linguistic Regularities...", - # with distances shifted to [0,1] per footnote (7) - pos_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in positive] - neg_dists = [((1 + dot(self.syn0norm, term)) / 2) for term in negative] - dists = prod(pos_dists, axis=0) / (prod(neg_dists, axis=0) + 0.000001) - - if not topn: - return dists - best = matutils.argsort(dists, topn=topn + len(all_words), reverse=True) - # ignore (don't return) words from the input - result = [(self.index2word[sim], float(dists[sim])) for sim in best if sim not in all_words] - return result[:topn] + return self.wv.most_similar_cosmul(positive, negative, 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) + return self.wv.similar_by_word(word, topn, 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) + return self.wv.similar_by_vector(vector, topn, restrict_vocab) def doesnt_match(self, words): - """ - Which word from the given list doesn't go with the others? - - Example:: - - >>> trained_model.doesnt_match("breakfast cereal dinner lunch".split()) - 'cereal' - - """ - self.init_sims() - - words = [word for word in words if word in self.vocab] # filter out OOV words - logger.debug("using words %s" % words) - if not words: - raise ValueError("cannot select a word from an empty list") - vectors = vstack(self.syn0norm[self.vocab[word].index] for word in words).astype(REAL) - mean = matutils.unitvec(vectors.mean(axis=0)).astype(REAL) - dists = dot(vectors, mean) - return sorted(zip(dists, words))[0][1] + return self.wv.doesnt_match(words) 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.syn0[self.vocab[words].index] - - return vstack([self.syn0[self.vocab[word].index] for word in words]) + return self.wv.__getitem__(words) + + @property + def syn0norm(self): + logger.warning('direct access to syn0norm will not be supported in future gensim releases, please use model.wv.syn0norm') + return self.wv.syn0norm + + @syn0norm.setter + def syn0norm(self, value): + logger.warning('direct access to syn0norm will not be supported in future gensim releases, please use model.wv.syn0norm') + self.wv.syn0norm = value + + @syn0norm.deleter + def syn0norm(self): + logger.warning('direct access to syn0norm will not be supported in future gensim releases, please use model.wv.syn0norm') + del self.wv.syn0norm + + @property + def syn0(self): + logger.warning('direct access to syn0 will not be supported in future gensim releases, please use model.wv.syn0') + return self.wv.syn0 + + @syn0.setter + def syn0(self, value): + logger.warning('direct access to syn0 will not be supported in future gensim releases, please use model.wv.syn0') + self.wv.syn0 = value + + @syn0.deleter + def syn0(self): + logger.warning('direct access to syn0 will not be supported in future gensim releases, please use model.wv.syn0') + del self.wv.syn0 + + @property + def vocab(self): + logger.warning('direct access to vocab will not be supported in future gensim releases, please use model.wv.vocab') + return self.wv.vocab + + @vocab.setter + def vocab(self, value): + logger.warning('direct access to vocab will not be supported in future gensim releases, please use model.wv.vocab') + self.wv.vocab = value + + @vocab.deleter + def vocab(self): + logger.warning('direct access to vocab will not be supported in future gensim releases, please use model.wv.vocab') + del self.wv.vocab + + @property + def index2word(self): + logger.warning('direct access to index2word will not be supported in future gensim releases, please use model.wv.index2word') + return self.wv.index2word + + @index2word.setter + def index2word(self, value): + logger.warning('direct access to index2word will not be supported in future gensim releases, please use model.wv.index2word') + self.wv.index2word = value + + @index2word.deleter + def index2word(self): + logger.warning('direct access to index2word will not be supported in future gensim releases, please use model.wv.index2word') + del self.wv.index2word def __contains__(self, word): - return word in self.vocab + return self.wv.__contains__(word) def similarity(self, w1, w2): - """ - Compute cosine similarity between two words. - - Example:: - - >>> trained_model.similarity('woman', 'man') - 0.73723527 - - >>> trained_model.similarity('woman', 'woman') - 1.0 - - """ - return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2])) + return self.wv.similarity(w1, w2) def n_similarity(self, ws1, ws2): - """ - Compute cosine similarity between two sets of words. - - Example:: - - >>> trained_model.n_similarity(['sushi', 'shop'], ['japanese', 'restaurant']) - 0.61540466561049689 - - >>> trained_model.n_similarity(['restaurant', 'japanese'], ['japanese', 'restaurant']) - 1.0000000000000004 - - >>> trained_model.n_similarity(['sushi'], ['restaurant']) == trained_model.similarity('sushi', 'restaurant') - True - - """ - if not(len(ws1) and len(ws2)): - raise ZeroDivisionError('Atleast one of the passed list is empty.') - v1 = [self[word] for word in ws1] - v2 = [self[word] for word in ws2] - return dot(matutils.unitvec(array(v1).mean(axis=0)), - matutils.unitvec(array(v2).mean(axis=0))) - + return self.wv.n_similarity(ws1, ws2) def init_sims(self, replace=False): """ - Precompute L2-normalized vectors. - - If `replace` is set, forget the original vectors and only keep the normalized - ones = saves lots of memory! - - Note that you **cannot continue training** after doing a replace. The model becomes - effectively read-only = you can call `most_similar`, `similarity` etc., but not `train`. - + init_sims() resides in KeyedVectors because it deals with syn0 mainly, but because syn1 is not an attribute + of KeyedVectors, it has to be deleted in this class, and the normalizing of syn0 happens inside of KeyedVectors """ - if getattr(self, 'syn0norm', None) is None or replace: - logger.info("precomputing L2-norms of word weight vectors") - if replace: - for i in xrange(self.syn0.shape[0]): - self.syn0[i, :] /= sqrt((self.syn0[i, :] ** 2).sum(-1)) - self.syn0norm = self.syn0 - if hasattr(self, 'syn1'): - del self.syn1 - else: - self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL) + if replace and hasattr(self, 'syn1'): + del self.syn1 + return self.wv.init_sims(replace) def estimate_memory(self, vocab_size=None, report=None): """Estimate required memory for a model using current settings and provided vocabulary size.""" - vocab_size = vocab_size or len(self.vocab) + vocab_size = vocab_size or len(self.wv.vocab) report = report or {} report['vocab'] = vocab_size * (700 if self.hs else 500) report['syn0'] = vocab_size * self.vector_size * dtype(REAL).itemsize @@ -1661,180 +1386,45 @@ def estimate_memory(self, vocab_size=None, report=None): @staticmethod def log_accuracy(section): - correct, incorrect = len(section['correct']), len(section['incorrect']) - if correct + incorrect > 0: - logger.info("%s: %.1f%% (%i/%i)" % - (section['section'], 100.0 * correct / (correct + incorrect), - correct, correct + incorrect)) - - def accuracy(self, questions, restrict_vocab=30000, most_similar=most_similar, case_insensitive=True): - """ - Compute accuracy of the model. `questions` is a filename where lines are - 4-tuples of words, split into sections by ": SECTION NAME" lines. - See questions-words.txt in https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/word2vec/source-archive.zip for an example. - - The accuracy is reported (=printed to log and returned as a list) for each - section separately, plus there's one aggregate summary at the end. - - Use `restrict_vocab` to ignore all questions containing a word not in the first `restrict_vocab` - words (default 30,000). This may be meaningful if you've sorted the vocabulary by descending frequency. - In case `case_insensitive` is True, the first `restrict_vocab` words are taken first, and then - case normalization is performed. - - Use `case_insensitive` to convert all words in questions and vocab to their uppercase form before - evaluating the accuracy (default True). Useful in case of case-mismatch between training tokens - and question words. In case of multiple case variants of a single word, the vector for the first - occurrence (also the most frequent if vocabulary is sorted) is taken. - - This method corresponds to the `compute-accuracy` script of the original C word2vec. + return KeyedVectors.log_accuracy(section) - """ - ok_vocab = [(w, self.vocab[w]) for w in self.index2word[:restrict_vocab]] - ok_vocab = dict((w.upper(), v) for w, v in reversed(ok_vocab)) if case_insensitive else dict(ok_vocab) - - sections, section = [], None - for line_no, line in enumerate(utils.smart_open(questions)): - # TODO: use level3 BLAS (=evaluate multiple questions at once), for speed - line = utils.to_unicode(line) - if line.startswith(': '): - # a new section starts => store the old section - if section: - sections.append(section) - self.log_accuracy(section) - section = {'section': line.lstrip(': ').strip(), 'correct': [], 'incorrect': []} - else: - if not section: - raise ValueError("missing section header before line #%i in %s" % (line_no, questions)) - try: - if case_insensitive: - a, b, c, expected = [word.upper() for word in line.split()] - else: - a, b, c, expected = [word for word in line.split()] - except: - logger.info("skipping invalid line #%i in %s" % (line_no, questions)) - continue - if a not in ok_vocab or b not in ok_vocab or c not in ok_vocab or expected not in ok_vocab: - logger.debug("skipping line #%i with OOV words: %s" % (line_no, line.strip())) - continue - - original_vocab = self.vocab - self.vocab = ok_vocab - ignore = set([a, b, c]) # input words to be ignored - predicted = None - # find the most likely prediction, ignoring OOV words and input words - sims = most_similar(self, positive=[b, c], negative=[a], topn=False, restrict_vocab=restrict_vocab) - self.vocab = original_vocab - for index in matutils.argsort(sims, reverse=True): - predicted = self.index2word[index].upper() if case_insensitive else self.index2word[index] - if predicted in ok_vocab and predicted not in ignore: - if predicted != expected: - logger.debug("%s: expected %s, predicted %s", line.strip(), expected, predicted) - break - if predicted == expected: - section['correct'].append((a, b, c, expected)) - else: - section['incorrect'].append((a, b, c, expected)) - if section: - # store the last section, too - sections.append(section) - self.log_accuracy(section) - - total = { - 'section': 'total', - 'correct': sum((s['correct'] for s in sections), []), - 'incorrect': sum((s['incorrect'] for s in sections), []), - } - self.log_accuracy(total) - sections.append(total) - return sections + def accuracy(self, questions, restrict_vocab=30000, most_similar=None, case_insensitive=True): + most_similar = most_similar or KeyedVectors.most_similar + return self.wv.accuracy(questions, restrict_vocab, most_similar, case_insensitive) @staticmethod def log_evaluation(pearson, spearman, oov, pairs): - logger.info('Pearson correlation coefficient against {0:s}: {1:.4f}'.format(pairs, pearson[0])) - logger.info('Spearman rank-order correlation coefficient against {0:s}: {1:.4f}'.format(pairs, spearman[0])) - logger.info('Pairs with unknown words ratio: {0:.1f}%'.format(oov)) - + return KeyedVectors.log_evaluation(pearson, spearman, oov, pairs) def evaluation(self, pairs, delimiter='\t', restrict_vocab=300000, case_insensitive=True, dummy4unknown=False): - """ - Compute correlation of the model with human similarity judgments. `pairs` is a filename of a dataset where - lines are 3-tuples, each consisting of a word pair and a similarity value, separated by `delimiter'. - Example datasets can be found at http://technion.ac.il/~ira.leviant/wordsim353.zip or at - https://www.cl.cam.ac.uk/~fh295/SimLex-999.zip. - - The model is evaluated using Pearson correlation coefficient and Spearman rank-order correlation coefficient - between the similarities from the dataset and the similarities produced by the model itself. . - The results are printed to log and returned as a triple (pearson, spearman, ratio of pairs with unknown words). - - Use `restrict_vocab` to ignore all word pairs containing a word not in the first `restrict_vocab` - words (default 300,000). This may be meaningful if you've sorted the vocabulary by descending frequency. - If `case_insensitive` is True, the first `restrict_vocab` words are taken, and then case normalization - is performed. - - Use `case_insensitive` to convert all words in the pairs and vocab to their uppercase form before - evaluating the model (default True). Useful when you expect case-mismatch between training tokens - and words pairs in the dataset. If there are multiple case variants of a single word, the vector for the first - occurrence (also the most frequent if vocabulary is sorted) is taken. - - Use `dummy4unknown=True' to produce zero-valued similarities for pairs with out-of-vocabulary words. - Otherwise (default False), these pairs are skipped entirely. - """ - ok_vocab = [(w, self.vocab[w]) for w in self.index2word[:restrict_vocab]] - ok_vocab = dict((w.upper(), v) for w, v in reversed(ok_vocab)) if case_insensitive else dict(ok_vocab) - - similarity_gold = [] - similarity_model = [] - oov = 0 - - original_vocab = self.vocab - self.vocab = ok_vocab - - for line_no, line in enumerate(utils.smart_open(pairs)): - line = utils.to_unicode(line) - if line.startswith('#'): - # May be a comment - continue - else: - try: - if case_insensitive: - a, b, sim = [word.upper() for word in line.split(delimiter)] - else: - a, b, sim = [word for word in line.split(delimiter)] - sim = float(sim) - except: - logger.info('skipping invalid line #{0:d} in {1:s}'.format(line_no, pairs)) - continue - if a not in ok_vocab or b not in ok_vocab: - oov += 1 - if dummy4unknown: - similarity_model.append(0.0) - similarity_gold.append(sim) - continue - else: - logger.debug('skipping line #{0:d} with OOV words: {1:s}'.format(line_no, line.strip())) - continue - similarity_gold.append(sim) # Similarity from the dataset - similarity_model.append(self.similarity(a,b)) # Similarity from the model - self.vocab = original_vocab - spearman = stats.spearmanr(similarity_gold, similarity_model) - pearson = stats.pearsonr(similarity_gold, similarity_model) - oov_ratio = float(oov)/(len(similarity_gold)+oov)*100 - - logger.debug('Pearson correlation coefficient against {0:s}: {1:f} with p-value {2:f}' - .format(pairs, pearson[0], pearson[1])) - logger.debug('Spearman rank-order correlation coefficient against {0:s}: {1:f} with p-value {2:f}' - .format(pairs, spearman[0], spearman[1])) - logger.debug('Pairs with unknown words: {0:d}'.format(oov)) - self.log_evaluation(pearson, spearman, oov_ratio, pairs) - return pearson, spearman, oov_ratio - + return self.wv.evaluation(self, pairs, delimiter, restrict_vocab, case_insensitive, dummy4unknown) def __str__(self): - return "%s(vocab=%s, size=%s, alpha=%s)" % (self.__class__.__name__, len(self.index2word), self.vector_size, self.alpha) + return "%s(vocab=%s, size=%s, alpha=%s)" % (self.__class__.__name__, len(self.wv.index2word), self.vector_size, self.alpha) + + def _minimize_model(self, save_syn1 = False, save_syn1neg = False, save_syn0_lockf = False): + if hasattr(self, 'syn1') and not save_syn1: + del self.syn1 + if hasattr(self, 'syn1neg') and not save_syn1neg: + del self.syn1neg + if hasattr(self, 'syn0_lockf') and not save_syn0_lockf: + del self.syn0_lockf + self.model_trimmed_post_training = True + + def delete_temporary_training_data(self, replace_word_vectors_with_normalized=False): + """ + Discard parameters that are used in training and score. Use if you're sure you're done training a model. + If `replace_word_vectors_with_normalized` is set, forget the original vectors and only keep the normalized + ones = saves lots of memory! + """ + if replace_word_vectors_with_normalized: + self.init_sims(replace=True) + self._minimize_model() def save(self, *args, **kwargs): # don't bother storing the cached normalized vectors, recalculable table kwargs['ignore'] = kwargs.get('ignore', ['syn0norm', 'table', 'cum_table']) + super(Word2Vec, self).save(*args, **kwargs) save.__doc__ = utils.SaveLoad.save.__doc__ @@ -1849,14 +1439,14 @@ def load(cls, *args, **kwargs): model.make_cum_table() # rebuild cum_table from vocabulary if not hasattr(model, 'corpus_count'): model.corpus_count = None - for v in model.vocab.values(): + for v in model.wv.vocab.values(): if hasattr(v, 'sample_int'): break # already 0.12.0+ style int probabilities elif hasattr(v, 'sample_probability'): v.sample_int = int(round(v.sample_probability * 2**32)) del v.sample_probability if not hasattr(model, 'syn0_lockf') and hasattr(model, 'syn0'): - model.syn0_lockf = ones(len(model.syn0), dtype=REAL) + model.syn0_lockf = ones(len(model.wv.syn0), dtype=REAL) if not hasattr(model, 'random'): model.random = random.RandomState(model.seed) if not hasattr(model, 'train_count'): @@ -1864,6 +1454,15 @@ def load(cls, *args, **kwargs): model.total_train_time = 0 return model + def _load_specials(self, *args, **kwargs): + # loading from a pre-KeyedVectors word2vec model + if not hasattr(self, 'wv'): + wv = KeyedVectors() + wv.syn0 = self.__dict__.get('syn0', []) + wv.vocab = self.__dict__.get('vocab', {}) + wv.index2word = self.__dict__.get('index2word', []) + self.wv = wv + super(Word2Vec, self)._load_specials(*args, **kwargs) class BrownCorpus(object): """Iterate over sentences from the Brown corpus (part of NLTK data).""" @@ -2025,3 +1624,4 @@ def __iter__(self): model.accuracy(args.accuracy) logger.info("finished running %s", program) + From 093697138f3807688a625605cb9563343ba4b34d Mon Sep 17 00:00:00 2001 From: akutuzov Date: Thu, 15 Dec 2016 16:24:33 +0100 Subject: [PATCH 33/33] Scipy stats import --- gensim/models/keyedvectors.py | 1 + gensim/models/word2vec.py | 1 + 2 files changed, 2 insertions(+) diff --git a/gensim/models/keyedvectors.py b/gensim/models/keyedvectors.py index d29ebf8fc6..85faa561cb 100644 --- a/gensim/models/keyedvectors.py +++ b/gensim/models/keyedvectors.py @@ -24,6 +24,7 @@ from gensim.corpora.dictionary import Dictionary from six import string_types from six.moves import xrange +from scipy import stats logger = logging.getLogger(__name__) diff --git a/gensim/models/word2vec.py b/gensim/models/word2vec.py index 432beef0c4..6592f787f7 100644 --- a/gensim/models/word2vec.py +++ b/gensim/models/word2vec.py @@ -99,6 +99,7 @@ from six import iteritems, itervalues, string_types from six.moves import xrange from types import GeneratorType +from scipy import stats logger = logging.getLogger(__name__)

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