tomoto 0.3.1 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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