tomoto 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +4 -14
  5. data/ext/tomoto/extconf.rb +11 -6
  6. data/ext/tomoto/llda.cpp +13 -0
  7. data/lib/tomoto/lda.rb +6 -1
  8. data/lib/tomoto/version.rb +1 -1
  9. data/vendor/EigenRand/EigenRand/Core.h +2 -2
  10. data/vendor/EigenRand/EigenRand/Dists/Basic.h +66 -4
  11. data/vendor/EigenRand/EigenRand/Dists/Discrete.h +3 -3
  12. data/vendor/EigenRand/EigenRand/Dists/GammaPoisson.h +2 -2
  13. data/vendor/EigenRand/EigenRand/Dists/NormalExp.h +2 -2
  14. data/vendor/EigenRand/EigenRand/EigenRand +2 -2
  15. data/vendor/EigenRand/EigenRand/Macro.h +3 -3
  16. data/vendor/EigenRand/EigenRand/MorePacketMath.h +2 -2
  17. data/vendor/EigenRand/EigenRand/MvDists/Multinomial.h +2 -2
  18. data/vendor/EigenRand/EigenRand/MvDists/MvNormal.h +2 -2
  19. data/vendor/EigenRand/EigenRand/PacketFilter.h +2 -2
  20. data/vendor/EigenRand/EigenRand/PacketRandomEngine.h +23 -8
  21. data/vendor/EigenRand/EigenRand/RandUtils.h +4 -4
  22. data/vendor/EigenRand/EigenRand/arch/AVX/MorePacketMath.h +2 -2
  23. data/vendor/EigenRand/EigenRand/arch/AVX/PacketFilter.h +2 -2
  24. data/vendor/EigenRand/EigenRand/arch/AVX/RandUtils.h +3 -3
  25. data/vendor/EigenRand/EigenRand/arch/NEON/MorePacketMath.h +2 -2
  26. data/vendor/EigenRand/EigenRand/arch/NEON/PacketFilter.h +2 -2
  27. data/vendor/EigenRand/EigenRand/arch/NEON/RandUtils.h +3 -3
  28. data/vendor/EigenRand/EigenRand/arch/SSE/MorePacketMath.h +2 -2
  29. data/vendor/EigenRand/EigenRand/arch/SSE/PacketFilter.h +2 -2
  30. data/vendor/EigenRand/EigenRand/arch/SSE/RandUtils.h +3 -3
  31. data/vendor/EigenRand/README.md +4 -0
  32. data/vendor/tomotopy/README.kr.rst +7 -0
  33. data/vendor/tomotopy/README.rst +22 -0
  34. data/vendor/tomotopy/src/Utils/EigenAddonOps.hpp +1 -1
  35. data/vendor/tomotopy/src/Utils/neon_gamma.h +51 -0
  36. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7ebf68dfdd1842174f9f8c3b8459de5cb9943f194c0df0e75bad6b2747d7546
4
- data.tar.gz: 97ed983d26beb5e172dbb42316b67256930032f017e9efabc27d0dbcf419959b
3
+ metadata.gz: daa9c454c4cf09e120dbbe17305d225be58ac5937c463886e87ea1b3c3b5d466
4
+ data.tar.gz: f6c0c353a0efcc6026964e9125f1156b50e0d119506ecab2812522f7b716042d
5
5
  SHA512:
6
- metadata.gz: 5173e759d7091f2621f70b8e45906585a33bdaf3093b4ed9e6ce637e172773e1d0cc7d8233156ec3715707b33de221b42f643582a75aa2e2506bb7de49bb1e11
7
- data.tar.gz: 0bd48bfe76e6ce72193c9b1b7e2f50967dd76c3125aeb0cbade7dc91979017e5a01d5879c205998ac8af87ef547b2604743d2571190b24730646d847910c1200
6
+ metadata.gz: 874f531a75a62d2291793ded080f380f8103682c2ae2b087dd31a014533443d5f35a7ea4e634aabd246fab1564ece35679c60c0b6ffbb6a627d57048e32bf790
7
+ data.tar.gz: e91bf3c618394f34f208fe4945729db6719a2cab1a8e7192e646b232d7e38274f2087808d145dccddb94b3cc632b9dddce82f942f051a4bf522ec5ec9d2c43b3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 0.3.3 (2023-02-01)
2
+
3
+ - Added `topic_label_dict` method to `LLDA`
4
+ - Fixed error with `infer` with loaded model
5
+
6
+ ## 0.3.2 (2023-01-22)
7
+
8
+ - Added precompiled gem for Mac ARM
9
+ - Updated tomoto to 0.12.4
10
+
1
11
  ## 0.3.1 (2023-01-12)
2
12
 
3
13
  - Added support for Ruby 3.2
data/LICENSE.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2019, bab2min
4
- Copyright (c) 2020-2021 Andrew Kane
4
+ Copyright (c) 2020-2023 Andrew Kane
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -12,17 +12,15 @@ Add this line to your application’s Gemfile:
12
12
  gem "tomoto"
13
13
  ```
14
14
 
15
- ARM is not currently supported
16
-
17
15
  ## Getting Started
18
16
 
19
17
  Train a model
20
18
 
21
19
  ```ruby
22
20
  model = Tomoto::LDA.new(k: 2)
23
- model.add_doc("text from document one")
24
- model.add_doc("text from document two")
25
- model.add_doc("text from document three")
21
+ model.add_doc(["tokens", "from", "document", "one"])
22
+ model.add_doc(["tokens", "from", "document", "two"])
23
+ model.add_doc(["tokens", "from", "document", "three"])
26
24
  model.train(100) # iterations
27
25
  ```
28
26
 
@@ -78,7 +76,7 @@ model.ll_per_word
78
76
  Perform inference for unseen documents
79
77
 
80
78
  ```ruby
81
- doc = model.make_doc("unseen doc")
79
+ doc = model.make_doc(["unseen", "doc"])
82
80
  topic_dist, ll = model.infer(doc)
83
81
  ```
84
82
 
@@ -114,14 +112,6 @@ If a method or option you need isn’t supported, feel free to open an issue.
114
112
  - [LDA](examples/lda_basic.rb)
115
113
  - [HDP](examples/hdp_basic.rb)
116
114
 
117
- ## Tokenization
118
-
119
- Documents are tokenized by whitespace by default, or you can perform your own tokenization.
120
-
121
- ```ruby
122
- model.add_doc(["tokens", "from", "document", "one"])
123
- ```
124
-
125
115
  ## Performance
126
116
 
127
117
  tomoto uses AVX2, AVX, or SSE2 instructions to increase performance on machines that support it. Check which instruction set architecture it’s using with:
@@ -3,12 +3,17 @@ require "mkmf-rice"
3
3
  $CXXFLAGS += " -std=c++17 $(optflags) -DEIGEN_MPL2_ONLY"
4
4
 
5
5
  unless ENV["RUBY_CC_VERSION"]
6
- # ARM not supported yet
7
- # https://github.com/bab2min/tomotopy/issues/170
8
-
9
- # AVX-512F not supported yet
10
- # https://github.com/bab2min/tomotopy/issues/188
11
- $CXXFLAGS << " " << with_config("optflags", "-march=native -mno-avx512f")
6
+ default_optflags =
7
+ if RbConfig::CONFIG["host_os"] =~ /darwin/i && RbConfig::CONFIG["host_cpu"] =~ /arm|aarch64/i
8
+ # -march=native not supported with Mac ARM
9
+ ""
10
+ else
11
+ # AVX-512F not supported yet
12
+ # https://github.com/bab2min/tomotopy/issues/188
13
+ "-march=native -mno-avx512f"
14
+ end
15
+
16
+ $CXXFLAGS << " " << with_config("optflags", default_optflags)
12
17
  end
13
18
 
14
19
  apple_clang = RbConfig::CONFIG["CC_VERSION_MESSAGE"] =~ /apple clang/i
data/ext/tomoto/llda.cpp CHANGED
@@ -29,5 +29,18 @@ void init_llda(Rice::Module& m) {
29
29
  "topics_per_label",
30
30
  [](tomoto::ILLDAModel& self) {
31
31
  return self.getNumTopicsPerLabel();
32
+ })
33
+ .define_method(
34
+ "topic_label_dict",
35
+ [](tomoto::ILLDAModel& self) {
36
+ auto dict = self.getTopicLabelDict();
37
+ Array res;
38
+ auto utf8 = Rice::Class(rb_cEncoding).call("const_get", "UTF_8");
39
+ for (size_t i = 0; i < dict.size(); i++) {
40
+ VALUE value = Rice::detail::To_Ruby<std::string>().convert(dict.toWord(i));
41
+ Object obj(value);
42
+ res.push(obj.call("force_encoding", utf8));
43
+ }
44
+ return res;
32
45
  });
33
46
  }
data/lib/tomoto/lda.rb CHANGED
@@ -24,7 +24,7 @@ module Tomoto
24
24
 
25
25
  # TODO support multiple docs
26
26
  def infer(doc, iter: 100, tolerance: -1, workers: 0, parallel: :default, together: 0)
27
- raise "cannot infer with untrained model" unless defined?(@prepared)
27
+ raise "cannot infer with untrained model" unless trained?
28
28
  _infer(doc, iter, tolerance, workers, to_ps(parallel), together)
29
29
  end
30
30
 
@@ -86,6 +86,7 @@ module Tomoto
86
86
  end
87
87
  end
88
88
 
89
+ # TODO raise error if iterations < 1
89
90
  def train(iterations = 10, workers: 0, parallel: :default)
90
91
  prepare
91
92
  _train(iterations, workers, to_ps(parallel))
@@ -97,6 +98,10 @@ module Tomoto
97
98
 
98
99
  private
99
100
 
101
+ def trained?
102
+ global_step.positive?
103
+ end
104
+
100
105
  def prepare
101
106
  unless defined?(@prepared)
102
107
  _prepare(@min_cf, @min_df, @rm_top)
@@ -1,3 +1,3 @@
1
1
  module Tomoto
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.3"
3
3
  end
@@ -2,8 +2,8 @@
2
2
  * @file Core.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file Basic.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -360,6 +360,31 @@ namespace Eigen
360
360
  }
361
361
  };
362
362
 
363
+ namespace detail
364
+ {
365
+ template<size_t v>
366
+ struct BitWidth
367
+ {
368
+ static constexpr size_t value = BitWidth<v / 2>::value + 1;
369
+ };
370
+
371
+ template<>
372
+ struct BitWidth<0>
373
+ {
374
+ static constexpr size_t value = 0;
375
+ };
376
+
377
+ template<class Rng>
378
+ struct RngBitSize
379
+ {
380
+ static constexpr size_t _min = Rng::min();
381
+ static constexpr size_t _max = Rng::max();
382
+
383
+ static constexpr bool _fullbit_rng = _min == 0 && (_max & (_max + 1)) == 0;
384
+ static constexpr size_t value = IsPacketRandomEngine<Rng>::value ? sizeof(typename Rng::result_type) * 8 : (_fullbit_rng ? BitWidth<_max>::value : 0);
385
+ };
386
+ }
387
+
363
388
  /**
364
389
  * @brief Generator of reals in a range `[0, 1)`
365
390
  *
@@ -373,20 +398,57 @@ namespace Eigen
373
398
  public:
374
399
  using Scalar = _Scalar;
375
400
 
376
- template<typename Rng>
401
+ template<typename Rng,
402
+ typename std::enable_if<sizeof(Scalar) * 8 <= detail::RngBitSize<typename std::remove_const<typename std::remove_reference<Rng>::type>::type>::value, int>::type = 0
403
+ >
377
404
  EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng)
378
405
  {
379
406
  using namespace Eigen::internal;
380
407
  return BitScalar<_Scalar>{}.to_ur(ExtractFirstUint<_Scalar>{}(std::forward<Rng>(rng)()));
381
408
  }
382
409
 
383
- template<typename Rng>
410
+ template<typename Rng,
411
+ typename std::enable_if<detail::RngBitSize<typename std::remove_const<typename std::remove_reference<Rng>::type>::type>::value < sizeof(Scalar) * 8, int>::type = 0
412
+ >
413
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng)
414
+ {
415
+ using RRng = typename std::remove_const<typename std::remove_reference<Rng>::type>::type;
416
+ static_assert(detail::RngBitSize<RRng>::value > 0,
417
+ "BaseRng must be a kind of mersenne_twister_engine.");
418
+ using ResultType = typename std::conditional<detail::RngBitSize<RRng>::value == 32, uint32_t, uint64_t>::type;
419
+ using namespace Eigen::internal;
420
+ ResultType arr[sizeof(Scalar) / sizeof(ResultType)];
421
+ for (size_t i = 0; i < sizeof(Scalar) / sizeof(ResultType); ++i)
422
+ {
423
+ arr[i] = rng();
424
+ }
425
+ return BitScalar<_Scalar>{}.to_ur(*(uint64_t*)arr);
426
+ }
427
+
428
+ template<typename Rng,
429
+ typename std::enable_if<sizeof(Scalar) <= sizeof(typename std::remove_const<typename std::remove_reference<Rng>::type>::type::result_type), int>::type = 0
430
+ >
384
431
  EIGEN_STRONG_INLINE const _Scalar nzur_scalar(Rng&& rng)
385
432
  {
386
433
  using namespace Eigen::internal;
387
434
  return BitScalar<_Scalar>{}.to_nzur(ExtractFirstUint<_Scalar>{}(std::forward<Rng>(rng)()));
388
435
  }
389
436
 
437
+ template<typename Rng,
438
+ typename std::enable_if<sizeof(typename std::remove_const<typename std::remove_reference<Rng>::type>::type::result_type) < sizeof(Scalar), int > ::type = 0
439
+ >
440
+ EIGEN_STRONG_INLINE const _Scalar nzur_scalar(Rng&& rng)
441
+ {
442
+ using namespace Eigen::internal;
443
+ using RngResult = typename std::remove_const<typename std::remove_reference<Rng>::type>::type::result_type;
444
+ RngResult arr[sizeof(Scalar) / sizeof(RngResult)];
445
+ for (size_t i = 0; i < sizeof(Scalar) / sizeof(RngResult); ++i)
446
+ {
447
+ arr[i] = rng();
448
+ }
449
+ return BitScalar<_Scalar>{}.to_nzur(*(Scalar*)arr);
450
+ }
451
+
390
452
  template<typename Packet, typename Rng>
391
453
  EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng)
392
454
  {
@@ -2,8 +2,8 @@
2
2
  * @file Discrete.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -264,7 +264,7 @@ namespace Eigen
264
264
  {
265
265
  EIGENRAND_CHECK_INFINITY_LOOP();
266
266
  _Scalar cands = (_Scalar)(rx & bitmask);
267
- if (cands <= pdiff) return cands;
267
+ if (cands <= pdiff) return cands + pmin;
268
268
  if (bitcnt + bitsize < 32)
269
269
  {
270
270
  rx >>= bitsize;
@@ -2,8 +2,8 @@
2
2
  * @file GammaPoisson.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file NormalExp.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file EigenRand
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-17
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file Macro.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-28
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -14,7 +14,7 @@
14
14
 
15
15
  #define EIGENRAND_WORLD_VERSION 0
16
16
  #define EIGENRAND_MAJOR_VERSION 4
17
- #define EIGENRAND_MINOR_VERSION 0
17
+ #define EIGENRAND_MINOR_VERSION 1
18
18
 
19
19
  #if EIGEN_VERSION_AT_LEAST(3,3,10)
20
20
  #define EIGENRAND_EIGEN_34_MODE
@@ -2,8 +2,8 @@
2
2
  * @file MorePacketMath.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file Multinomial.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file MvNormal.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file PacketFilter.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file PacketRandomEngine.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -25,11 +25,17 @@ namespace Eigen
25
25
  namespace detail
26
26
  {
27
27
  template<typename T>
28
- auto test_integral_result_type(int)->std::integral_constant<bool, std::is_integral<typename T::result_type>::value>;
28
+ auto test_integral_result_type(int)->std::integral_constant<bool, std::is_integral<typename T::result_type>::value && !(T::min() == 0 && (T::max() & T::max() + 1) == 0)>;
29
29
 
30
30
  template<typename T>
31
31
  auto test_integral_result_type(...)->std::false_type;
32
32
 
33
+ template<typename T>
34
+ auto test_integral_fullbit_result_type(int)->std::integral_constant<bool, std::is_integral<typename T::result_type>::value&& T::min() == 0 && (T::max() & T::max() + 1) == 0>;
35
+
36
+ template<typename T>
37
+ auto test_integral_fullbit_result_type(...)->std::false_type;
38
+
33
39
  template<typename T>
34
40
  auto test_intpacket_result_type(int)->std::integral_constant<bool, internal::IsIntPacket<typename T::result_type>::value>;
35
41
 
@@ -42,6 +48,11 @@ namespace Eigen
42
48
  {
43
49
  };
44
50
 
51
+ template<typename Ty>
52
+ struct IsScalarFullBitRandomEngine : decltype(detail::test_integral_fullbit_result_type<Ty>(0))
53
+ {
54
+ };
55
+
45
56
  template<typename Ty>
46
57
  struct IsPacketRandomEngine : decltype(detail::test_intpacket_result_type<Ty>(0))
47
58
  {
@@ -49,14 +60,15 @@ namespace Eigen
49
60
 
50
61
  enum class RandomEngineType
51
62
  {
52
- none, scalar, packet
63
+ none, scalar, scalar_fullbit, packet
53
64
  };
54
65
 
55
66
  template<typename Ty>
56
67
  struct GetRandomEngineType : std::integral_constant <
57
68
  RandomEngineType,
58
69
  IsPacketRandomEngine<Ty>::value ? RandomEngineType::packet :
59
- (IsScalarRandomEngine<Ty>::value ? RandomEngineType::scalar : RandomEngineType::none)
70
+ IsScalarFullBitRandomEngine<Ty>::value ? RandomEngineType::scalar_fullbit :
71
+ IsScalarRandomEngine<Ty>::value ? RandomEngineType::scalar : RandomEngineType::none
60
72
  >
61
73
  {
62
74
  };
@@ -257,7 +269,7 @@ namespace Eigen
257
269
  *
258
270
  * @return uint64_t
259
271
  */
260
- uint64_t min() const
272
+ static constexpr uint64_t min()
261
273
  {
262
274
  return 0;
263
275
  }
@@ -267,7 +279,7 @@ namespace Eigen
267
279
  *
268
280
  * @return uint64_t
269
281
  */
270
- uint64_t max() const
282
+ static constexpr uint64_t max()
271
283
  {
272
284
  return _wMask;
273
285
  }
@@ -418,6 +430,7 @@ namespace Eigen
418
430
  class ParallelRandomEngineAdaptor
419
431
  {
420
432
  static_assert(GetRandomEngineType<BaseRng>::value != RandomEngineType::none, "BaseRng must be a kind of Random Engine.");
433
+ static_assert(GetRandomEngineType<BaseRng>::value != RandomEngineType::scalar, "BaseRng must be a kind of mersenne_twister_engine.");
421
434
  public:
422
435
  using result_type = UIntType;
423
436
 
@@ -547,7 +560,7 @@ namespace Eigen
547
560
  IsPacketRandomEngine<typename std::remove_reference<Rng>::type>::value,
548
561
  PacketRandomEngineAdaptor<UIntType, typename std::remove_reference<Rng>::type>,
549
562
  typename std::conditional<
550
- IsScalarRandomEngine<typename std::remove_reference<Rng>::type>::value,
563
+ IsScalarFullBitRandomEngine<typename std::remove_reference<Rng>::type>::value,
551
564
  RandomEngineWrapper<typename std::remove_reference<Rng>::type>,
552
565
  void
553
566
  >::type
@@ -564,6 +577,8 @@ namespace Eigen
564
577
  template<typename UIntType, typename Rng>
565
578
  UniversalRandomEngine<UIntType, Rng> makeUniversalRng(Rng&& rng)
566
579
  {
580
+ static_assert(IsPacketRandomEngine<typename std::remove_reference<Rng>::type>::value || IsScalarFullBitRandomEngine<typename std::remove_reference<Rng>::type>::value,
581
+ "`Rng` must be a kind of RandomPacketEngine like std::mersenne_twister_engine");
567
582
  return { std::forward<Rng>(rng) };
568
583
  }
569
584
 
@@ -2,8 +2,8 @@
2
2
  * @file RandUtils.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.3
6
- * @date 2021-03-31
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -55,7 +55,7 @@ namespace Eigen
55
55
  struct scalar_rng_adaptor
56
56
  {
57
57
  static_assert(
58
- Rand::IsScalarRandomEngine<
58
+ Rand::IsScalarFullBitRandomEngine<
59
59
  typename std::remove_reference<Rng>::type
60
60
  >::value ||
61
61
  Rand::IsPacketRandomEngine<
@@ -95,7 +95,7 @@ namespace Eigen
95
95
  struct scalar_rng_adaptor<Gen, _Scalar, Rng, true>
96
96
  {
97
97
  static_assert(
98
- Rand::IsScalarRandomEngine<
98
+ Rand::IsScalarFullBitRandomEngine<
99
99
  typename std::remove_reference<Rng>::type
100
100
  >::value ||
101
101
  Rand::IsPacketRandomEngine<
@@ -2,8 +2,8 @@
2
2
  * @file MorePacketMath.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.5
6
- * @date 2021-07-16
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file PacketFilter.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-17
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file RandUtils.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-17
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -57,7 +57,7 @@ namespace Eigen
57
57
  };
58
58
 
59
59
  template<typename Rng, typename RngResult>
60
- struct RawbitsMaker<Packet8i, Rng, RngResult, Rand::RandomEngineType::scalar>
60
+ struct RawbitsMaker<Packet8i, Rng, RngResult, Rand::RandomEngineType::scalar_fullbit>
61
61
  {
62
62
  EIGEN_STRONG_INLINE Packet8i rawbits(Rng& rng)
63
63
  {
@@ -2,8 +2,8 @@
2
2
  * @file MorePacketMath.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-04-26
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file PacketFilter.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-17
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file RandUtils.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-17
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -19,7 +19,7 @@ namespace Eigen
19
19
  namespace internal
20
20
  {
21
21
  template<typename Rng, typename RngResult>
22
- struct RawbitsMaker<Packet4i, Rng, RngResult, Rand::RandomEngineType::scalar>
22
+ struct RawbitsMaker<Packet4i, Rng, RngResult, Rand::RandomEngineType::scalar_fullbit>
23
23
  {
24
24
  EIGEN_STRONG_INLINE Packet4i rawbits(Rng& rng)
25
25
  {
@@ -2,8 +2,8 @@
2
2
  * @file MorePacketMath.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.3.5
6
- * @date 2021-07-16
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file PacketFilter.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-17
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -2,8 +2,8 @@
2
2
  * @file RandUtils.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.0
6
- * @date 2021-09-17
5
+ * @version 0.4.1
6
+ * @date 2022-08-13
7
7
  *
8
8
  * @copyright Copyright (c) 2020-2021
9
9
  *
@@ -19,7 +19,7 @@ namespace Eigen
19
19
  namespace internal
20
20
  {
21
21
  template<typename Rng, typename RngResult>
22
- struct RawbitsMaker<Packet4i, Rng, RngResult, Rand::RandomEngineType::scalar>
22
+ struct RawbitsMaker<Packet4i, Rng, RngResult, Rand::RandomEngineType::scalar_fullbit>
23
23
  {
24
24
  EIGEN_STRONG_INLINE Packet4i rawbits(Rng& rng)
25
25
  {
@@ -385,6 +385,10 @@ MIT License
385
385
 
386
386
  ## History
387
387
 
388
+ ### 0.4.1 (2022-08-13)
389
+ * Fixed a bug where double-type generation with std::mt19937 fails compilation.
390
+ * Fixed a bug where `UniformIntGen` in scalar mode generates numbers in the wrong range.
391
+
388
392
  ### 0.4.0 alpha (2021-09-28)
389
393
  * Now EigenRand supports ARM & ARM64 NEON architecture experimentally. Please report issues about ARM & ARM64 NEON.
390
394
  * Now EigenRand has compatibility to `Eigen 3.4.0`.
@@ -305,6 +305,13 @@ tomotopy의 Python3 예제 코드는 https://github.com/bab2min/tomotopy/blob/ma
305
305
 
306
306
  역사
307
307
  -------
308
+ * 0.12.4 (2023-01-22)
309
+ * New features
310
+ * macOS ARM64 아키텍처에 대한 지원을 추가했습니다.
311
+ * Bug fixes
312
+ * `tomotopy.Document.get_sub_topic_dist()`가 bad argument 예외를 발생시키는 문제를 해결했습니다.
313
+ * 예외 발생이 종종 크래시를 발생시키는 문제를 해결했습니다.
314
+
308
315
  * 0.12.3 (2022-07-19)
309
316
  * 기능 개선
310
317
  * 이제 `tomotopy.LDAModel.add_doc()`로 빈 문서를 삽입할 경우 예외를 발생시키는 대신 그냥 무시합니다. 새로 추가된 인자인 `ignore_empty_words`를 False로 설정할 경우 이전처럼 예외를 발생시킵니다.
@@ -309,6 +309,13 @@ meaning you can use it for any reasonable purpose and remain in complete ownersh
309
309
 
310
310
  History
311
311
  -------
312
+ * 0.12.4 (2023-01-22)
313
+ * New features
314
+ * Added support for macOS ARM64 architecture.
315
+ * Bug fixes
316
+ * Fixed an issue where `tomotopy.Document.get_sub_topic_dist()` raises a bad argument exception.
317
+ * Fixed an issue where exception raising sometimes causes crashes.
318
+
312
319
  * 0.12.3 (2022-07-19)
313
320
  * New features
314
321
  * Now, inserting an empty document using `tomotopy.LDAModel.add_doc()` just ignores it instead of raising an exception. If the newly added argument `ignore_empty_words` is set to False, an exception is raised as before.
@@ -514,3 +521,18 @@ Bundled Libraries and Their License
514
521
 
515
522
  * Mapbox Variant: `BSD License
516
523
  <licenses_bundled/MapboxVariant>`_
524
+
525
+ Citation
526
+ ---------
527
+ ::
528
+
529
+ @software{minchul_lee_2022_6868418,
530
+ author = {Minchul Lee},
531
+ title = {bab2min/tomotopy: 0.12.3},
532
+ month = jul,
533
+ year = 2022,
534
+ publisher = {Zenodo},
535
+ version = {v0.12.3},
536
+ doi = {10.5281/zenodo.6868418},
537
+ url = {https://doi.org/10.5281/zenodo.6868418}
538
+ }
@@ -93,7 +93,7 @@ namespace Eigen
93
93
  #endif
94
94
  #ifdef EIGEN_VECTORIZE_NEON
95
95
  #include <arm_neon.h>
96
-
96
+ #include "neon_gamma.h"
97
97
 
98
98
  namespace Eigen
99
99
  {
@@ -0,0 +1,51 @@
1
+ #pragma once
2
+
3
+ inline float32x4_t accurate_rcp(float32x4_t x)
4
+ {
5
+ float32x4_t r = vrecpeq_f32(x);
6
+ return vmulq_f32(vrecpsq_f32(x, r), r);
7
+ }
8
+
9
+ // approximation : lgamma(z) ~= (z+2.5)ln(z+3) - z - 3 + 0.5 ln (2pi) + 1/12/(z + 3) - ln (z(z+1)(z+2))
10
+ inline float32x4_t lgamma_ps(float32x4_t x)
11
+ {
12
+ float32x4_t x_3 = vaddq_f32(x, vmovq_n_f32(3));
13
+ float32x4_t ret = vmulq_f32(vaddq_f32(x_3, vmovq_n_f32(-0.5f)), Eigen::internal::plog(x_3));
14
+ ret = vsubq_f32(ret, x_3);
15
+ ret = vaddq_f32(ret, vmovq_n_f32(0.91893853f));
16
+ ret = vaddq_f32(ret, vdivq_f32(vmovq_n_f32(1 / 12.f), x_3));
17
+ ret = vsubq_f32(ret, Eigen::internal::plog(vmulq_f32(
18
+ vmulq_f32(vsubq_f32(x_3, vmovq_n_f32(1)), vsubq_f32(x_3, vmovq_n_f32(2))), x)));
19
+ return ret;
20
+ }
21
+
22
+ // approximation : lgamma(z + a) - lgamma(z) = (z + a + 1.5) * log(z + a + 2) - (z + 1.5) * log(z + 2) - a + (1. / (z + a + 2) - 1. / (z + 2)) / 12. - log(((z + a) * (z + a + 1)) / (z * (z + 1)))
23
+ inline float32x4_t lgamma_subt(float32x4_t z, float32x4_t a)
24
+ {
25
+ float32x4_t _1p5 = vmovq_n_f32(1.5);
26
+ float32x4_t _2 = vmovq_n_f32(2);
27
+ float32x4_t za = vaddq_f32(z, a);
28
+ float32x4_t ret = vmulq_f32(vaddq_f32(za, _1p5), Eigen::internal::plog(vaddq_f32(za, _2)));
29
+ ret = vsubq_f32(ret, vmulq_f32(vaddq_f32(z, _1p5), Eigen::internal::plog(vaddq_f32(z, _2))));
30
+ ret = vsubq_f32(ret, a);
31
+ float32x4_t _1 = vmovq_n_f32(1);
32
+ float32x4_t _1_12 = vmovq_n_f32(1 / 12.f);
33
+ ret = vaddq_f32(ret, vsubq_f32(vdivq_f32(_1_12, vaddq_f32(za, _2)), vdivq_f32(_1_12, vaddq_f32(z, _2))));
34
+ ret = vsubq_f32(ret, Eigen::internal::plog(vdivq_f32(vdivq_f32(vmulq_f32(za, vaddq_f32(za, _1)), z), vaddq_f32(z, _1))));
35
+ return ret;
36
+ }
37
+
38
+
39
+ // approximation : digamma(z) ~= ln(z+4) - 1/2/(z+4) - 1/12/(z+4)^2 - 1/z - 1/(z+1) - 1/(z+2) - 1/(z+3)
40
+ inline float32x4_t digamma_ps(float32x4_t x)
41
+ {
42
+ float32x4_t x_4 = vaddq_f32(x, vmovq_n_f32(4));
43
+ float32x4_t ret = Eigen::internal::plog(x_4);
44
+ ret = vsubq_f32(ret, vdivq_f32(vmovq_n_f32(1 / 2.f), x_4));
45
+ ret = vsubq_f32(ret, vdivq_f32(vdivq_f32(vmovq_n_f32(1 / 12.f), x_4), x_4));
46
+ ret = vsubq_f32(ret, accurate_rcp(vsubq_f32(x_4, vmovq_n_f32(1))));
47
+ ret = vsubq_f32(ret, accurate_rcp(vsubq_f32(x_4, vmovq_n_f32(2))));
48
+ ret = vsubq_f32(ret, accurate_rcp(vsubq_f32(x_4, vmovq_n_f32(3))));
49
+ ret = vsubq_f32(ret, accurate_rcp(vsubq_f32(x_4, vmovq_n_f32(4))));
50
+ return ret;
51
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tomoto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-13 00:00:00.000000000 Z
11
+ date: 2023-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice
@@ -518,6 +518,7 @@ files:
518
518
  - vendor/tomotopy/src/Utils/avx_mathfun.h
519
519
  - vendor/tomotopy/src/Utils/exception.h
520
520
  - vendor/tomotopy/src/Utils/math.h
521
+ - vendor/tomotopy/src/Utils/neon_gamma.h
521
522
  - vendor/tomotopy/src/Utils/rtnorm.hpp
522
523
  - vendor/tomotopy/src/Utils/sample.hpp
523
524
  - vendor/tomotopy/src/Utils/serializer.hpp