{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,3,31]],"date-time":"2026-03-31T23:09:58Z","timestamp":1774998598534,"version":"3.50.1"},"reference-count":106,"publisher":"Association for Computing Machinery (ACM)","issue":"4","license":[{"start":{"date-parts":[[2019,12,17]],"date-time":"2019-12-17T00:00:00Z","timestamp":1576540800000},"content-version":"vor","delay-in-days":0,"URL":"https:\/\/www.acm.org\/publications\/policies\/copyright_policy#Background"}],"funder":[{"DOI":"10.13039\/100011039","name":"Intelligence Advanced Research Projects Activity","doi-asserted-by":"publisher","award":["D16PC00002"],"award-info":[{"award-number":["D16PC00002"]}],"id":[{"id":"10.13039\/100011039","id-type":"DOI","asserted-by":"publisher"}]},{"DOI":"10.13039\/100000001","name":"National Science Foundation","doi-asserted-by":"publisher","award":["1314547, 1533644"],"award-info":[{"award-number":["1314547, 1533644"]}],"id":[{"id":"10.13039\/100000001","id-type":"DOI","asserted-by":"publisher"}]}],"content-domain":{"domain":["dl.acm.org"],"crossmark-restriction":true},"short-container-title":["ACM Trans. Parallel Comput."],"published-print":{"date-parts":[[2019,12,31]]},"abstract":"<jats:p>Tapir (pronounced TAY-per) is a compiler intermediate representation (IR) that embeds recursive fork-join parallelism, as supported by task-parallel programming platforms such as Cilk and OpenMP, into a mainstream compiler\u2019s IR. Mainstream compilers typically treat parallel linguistic constructs as syntactic sugar for function calls into a parallel runtime. These calls prevent the compiler from performing optimizations on and across parallel control constructs. Remedying this situation has generally been thought to require an extensive reworking of compiler analyses and code transformations to handle parallel semantics. Tapir leverages the \u201cserial-projection property,\u201d which is commonly satisfied by task-parallel programs, to handle the semantics of these programs without an extensive rework of the compiler.<\/jats:p>\n          <jats:p>For recursive fork-join programs that satisfy the serial-projection property, Tapir enables effective compiler optimization of parallel programs with only minor changes to existing compiler analyses and code transformations. Tapir uses the serial-projection property to order logically parallel fine-grained tasks in the program\u2019s control-flow graph. This ordered representation of parallel tasks allows the compiler to optimize parallel codes effectively with only minor modifications. For example, to implement Tapir\/LLVM, a prototype of Tapir in the LLVM compiler, we added or modified less than 3,000 lines of LLVM\u2019s half-million-line core middle-end functionality.<\/jats:p>\n          <jats:p>These changes sufficed to enable LLVM\u2019s existing compiler optimizations for serial code\u2014including loop-invariant-code motion, common-subexpression elimination, and tail-recursion elimination\u2014to work with parallel control constructs such as parallel loops and Cilk\u2019s Cilk_Spawn keyword. Tapir also supports parallel optimizations, such as loop scheduling, which restructure the parallel control flow of the program. By making use of existing LLVM optimizations and new parallel optimizations, Tapir\/LLVM can optimize recursive fork-join programs more effectively than traditional compilation methods. On a suite of 35 Cilk application benchmarks, Tapir\/LLVM produces more efficient executables for 30 benchmarks, with faster 18-core running times for 26 of them, compared to a nearly identical compiler that compiles parallel linguistic constructs the traditional way.<\/jats:p>","DOI":"10.1145\/3365655","type":"journal-article","created":{"date-parts":[[2019,12,17]],"date-time":"2019-12-17T13:32:58Z","timestamp":1576589578000},"page":"1-33","update-policy":"https:\/\/doi.org\/10.1145\/crossmark-policy","source":"Crossref","is-referenced-by-count":13,"title":["Tapir"],"prefix":"10.1145","volume":"6","author":[{"given":"Tao B.","family":"Schardl","sequence":"first","affiliation":[{"name":"MIT Computer Science and Artificial Intelligence Laboratory, Cambridge, MA, USA"}]},{"given":"William S.","family":"Moses","sequence":"additional","affiliation":[{"name":"MIT Computer Science and Artificial Intelligence Laboratory, Cambridge, MA, USA"}]},{"given":"Charles E.","family":"Leiserson","sequence":"additional","affiliation":[{"name":"MIT Computer Science and Artificial Intelligence Laboratory, Cambridge, MA, USA"}]}],"member":"320","published-online":{"date-parts":[[2019,12,17]]},"reference":[{"key":"e_1_2_1_1_1","volume-title":"Proceedings of PPoPP. 183--193","author":"Agarwal Shivali"},{"key":"e_1_2_1_2_1","doi-asserted-by":"publisher","DOI":"10.1109\/IPDPS.2010.5470403"},{"key":"e_1_2_1_3_1","volume-title":"Ullman","author":"Aho Alfred V.","year":"2006"},{"key":"e_1_2_1_4_1","series-title":"Lecture Notes in Computer Science","volume-title":"Static analyses for eliminating unnecessary synchronization from Java programs","author":"Aldrich Jonathan"},{"key":"e_1_2_1_5_1","volume-title":"Proceedings of SPAA. 119--129","author":"Arora Nimar S."},{"key":"e_1_2_1_6_1","doi-asserted-by":"publisher","DOI":"10.1109\/TPDS.2008.105"},{"key":"e_1_2_1_7_1","doi-asserted-by":"publisher","DOI":"10.1109\/PACT.2009.32"},{"key":"e_1_2_1_8_1","doi-asserted-by":"publisher","DOI":"10.1109\/PACT.2013.6618794"},{"key":"e_1_2_1_9_1","doi-asserted-by":"publisher","DOI":"10.1145\/1736020.1736029"},{"key":"e_1_2_1_10_1","doi-asserted-by":"publisher","DOI":"10.1145\/1640089.1640096"},{"key":"e_1_2_1_11_1","doi-asserted-by":"publisher","DOI":"10.1145\/227234.227246"},{"key":"e_1_2_1_12_1","doi-asserted-by":"publisher","DOI":"10.1145\/2145816.2145840"},{"key":"e_1_2_1_13_1","doi-asserted-by":"publisher","DOI":"10.1006\/jpdc.1996.0107"},{"key":"e_1_2_1_14_1","doi-asserted-by":"publisher","DOI":"10.1145\/324133.324234"},{"key":"e_1_2_1_15_1","volume-title":"Proceedings of HotPar.","author":"Bocchino Robert L.","year":"2009"},{"key":"e_1_2_1_16_1","volume-title":"Adve","author":"Boehm J.","year":"2008"},{"key":"e_1_2_1_17_1","doi-asserted-by":"publisher","DOI":"10.1145\/263699.263735"},{"key":"e_1_2_1_18_1","doi-asserted-by":"publisher","DOI":"10.1145\/2093157.2093165"},{"key":"e_1_2_1_19_1","doi-asserted-by":"publisher","DOI":"10.1109\/PACT.2015.44"},{"key":"e_1_2_1_20_1","first-page":"2","article-title":"Programming with exceptions in JCilk. Sci","volume":"63","author":"Danaher John S.","year":"2008","journal-title":"Comput. Program."},{"key":"e_1_2_1_21_1","doi-asserted-by":"publisher","DOI":"10.1145\/1508244.1508255"},{"key":"e_1_2_1_22_1","doi-asserted-by":"publisher","DOI":"10.1145\/1950365.1950376"},{"key":"e_1_2_1_23_1","doi-asserted-by":"publisher","DOI":"10.1145\/1048935.1050159"},{"key":"e_1_2_1_24_1","volume-title":"Leiserson","author":"Feng Mingdong","year":"1997"},{"key":"e_1_2_1_25_1","doi-asserted-by":"publisher","DOI":"10.1007\/s002240000120"},{"key":"e_1_2_1_26_1","volume-title":"Leiserson","author":"Fineman Jeremy T.","year":"2011"},{"key":"e_1_2_1_27_1","doi-asserted-by":"publisher","DOI":"10.1145\/169627.169855"},{"key":"e_1_2_1_28_1","doi-asserted-by":"publisher","DOI":"10.1145\/1583991.1584017"},{"key":"e_1_2_1_29_1","volume-title":"Randall","author":"Frigo Matteo","year":"1998"},{"key":"e_1_2_1_30_1","unstructured":"GCC Team. 2014. GCC 4.9 Release Series Changes New Features and Fixes. Retrieved from https:\/\/gcc.gnu.org\/gcc-4.9\/changes.html.  GCC Team. 2014. GCC 4.9 Release Series Changes New Features and Fixes. Retrieved from https:\/\/gcc.gnu.org\/gcc-4.9\/changes.html."},{"key":"e_1_2_1_31_1","unstructured":"GCC Team. 2015. GOMP\u2014An OpenMP Implementation for GCC. Retrieved from https:\/\/gcc.gnu.org\/projects\/gomp\/.  GCC Team. 2015. GOMP\u2014An OpenMP Implementation for GCC. Retrieved from https:\/\/gcc.gnu.org\/projects\/gomp\/."},{"key":"e_1_2_1_32_1","doi-asserted-by":"publisher","DOI":"10.1145\/72935.72953"},{"key":"e_1_2_1_33_1","volume-title":"Proceedings of the Technical Symposium on Computer Science Education (SIGCSE \u201912)","author":"Grossman Dan"},{"key":"e_1_2_1_34_1","doi-asserted-by":"publisher","DOI":"10.1145\/155332.155349"},{"key":"e_1_2_1_37_1","doi-asserted-by":"publisher","DOI":"10.1145\/4472.4478"},{"key":"e_1_2_1_38_1","volume-title":"Leiserson","author":"He Yuxiong","year":"2010"},{"key":"e_1_2_1_40_1","doi-asserted-by":"publisher","DOI":"10.1145\/366622.366642"},{"key":"e_1_2_1_41_1","volume-title":"Proceedings of SC.","author":"Hochstein L."},{"key":"e_1_2_1_42_1","volume-title":"Wood","author":"Hower Derek R.","year":"2011"},{"key":"e_1_2_1_43_1","volume-title":"Information Technology\u2014Portable Operating System Interface (POSIX)\u2014Part 1: System Application Program Interface (API) [C Language]","author":"Institute of Electrical and Electronic Engineers. [n.d.].","year":"1996"},{"key":"e_1_2_1_44_1","unstructured":"Intel Corporation. 2010. Intel Cilk Plus Application Binary Interface Specification. Document Number: 324512-001US. Retrieved from https:\/\/software.intel.com\/sites\/products\/cilk-plus\/cilk_plus_abi.pdf.  Intel Corporation. 2010. Intel Cilk Plus Application Binary Interface Specification. Document Number: 324512-001US. Retrieved from https:\/\/software.intel.com\/sites\/products\/cilk-plus\/cilk_plus_abi.pdf."},{"key":"e_1_2_1_45_1","unstructured":"Intel Corporation. 2010. Intel Cilk Plus Language Specification. Document Number: 324396-001US. Retrieved from http:\/\/software.intel.com\/sites\/products\/cilk-plus\/cilk_plus_language_specification.pdf.  Intel Corporation. 2010. Intel Cilk Plus Language Specification. Document Number: 324396-001US. Retrieved from http:\/\/software.intel.com\/sites\/products\/cilk-plus\/cilk_plus_language_specification.pdf."},{"key":"e_1_2_1_46_1","unstructured":"Intel Corporation. 2013. Cilk Plus\/LLVM. Retrieved from http:\/\/cilkplus.github.io\/.  Intel Corporation. 2013. Cilk Plus\/LLVM. Retrieved from http:\/\/cilkplus.github.io\/."},{"key":"e_1_2_1_47_1","volume-title":"Version 1.2","author":"Intel Corporation 2013."},{"key":"e_1_2_1_48_1","unstructured":"Intel Corporation. 2015. Intel C++ Compiler 16.0 User and Reference Guide.  Intel Corporation. 2015. Intel C++ Compiler 16.0 User and Reference Guide."},{"key":"e_1_2_1_49_1","unstructured":"Intel Corporation. 2018. Intel Cilk Plus Samples. Retrieved from https:\/\/software.intel.com\/en-us\/code-samples\/intel-compiler\/all-samples-and-downloads.  Intel Corporation. 2018. Intel Cilk Plus Samples. Retrieved from https:\/\/software.intel.com\/en-us\/code-samples\/intel-compiler\/all-samples-and-downloads."},{"key":"e_1_2_1_50_1","doi-asserted-by":"publisher","DOI":"10.1145\/2830772.2830777"},{"key":"e_1_2_1_51_1","volume-title":"Chakrabarti","author":"Joisha Pramod G.","year":"2011"},{"key":"e_1_2_1_52_1","doi-asserted-by":"publisher","DOI":"10.1109\/PACT.2013.6618792"},{"key":"e_1_2_1_53_1","volume-title":"Ritchie","author":"Kernighan Brian W.","year":"1988"},{"key":"e_1_2_1_55_1","first-page":"1","article-title":"LLVM parallel intermediate representation: Design and evaluation using OpenSHMEM communications","volume":"2","author":"Khaldi Dounia","year":"2015","journal-title":"Proceedings of LLVM."},{"key":"e_1_2_1_56_1","doi-asserted-by":"publisher","DOI":"10.1145\/229542.229545"},{"key":"e_1_2_1_57_1","doi-asserted-by":"publisher","DOI":"10.1109\/TC.1979.1675439"},{"key":"e_1_2_1_58_1","doi-asserted-by":"publisher","DOI":"10.1109\/CGO.2004.1281665"},{"key":"e_1_2_1_59_1","doi-asserted-by":"publisher","DOI":"10.1109\/MC.2006.127"},{"key":"e_1_2_1_60_1","article-title":"On-the-fly pipeline parallelism","volume":"2","author":"Lee Ting Angelina","year":"2015","journal-title":"Trans. Parallel Comput."},{"key":"e_1_2_1_61_1","volume-title":"Leiserson","author":"Lee Ting Angelina","year":"2012"},{"key":"e_1_2_1_62_1","volume-title":"Padua","author":"Lee Jaejin","year":"1997"},{"key":"e_1_2_1_63_1","doi-asserted-by":"publisher","DOI":"10.1007\/s11227-010-0405-3"},{"key":"e_1_2_1_64_1","unstructured":"LLVM Developer List. 2012. [LLVMdev] [cfe-dev] SPIR Provisional Specification Is Now Available in the Khronos Website. Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2012-September\/053293.html.  LLVM Developer List. 2012. [LLVMdev] [cfe-dev] SPIR Provisional Specification Is Now Available in the Khronos Website. Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2012-September\/053293.html."},{"key":"e_1_2_1_65_1","unstructured":"LLVM Developer List. 2012. [LLVMdev] [RFC] OpenMP Representation in LLVM IR. Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2012-September\/053861.html.  LLVM Developer List. 2012. [LLVMdev] [RFC] OpenMP Representation in LLVM IR. Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2012-September\/053861.html."},{"key":"e_1_2_1_66_1","unstructured":"LLVM Developer List. 2012. [LLVMdev] [RFC] Parallelization Metadata and Intrinsics in LLVM (for OpenMP Etc.). Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2012-September\/053792.html.  LLVM Developer List. 2012. [LLVMdev] [RFC] Parallelization Metadata and Intrinsics in LLVM (for OpenMP Etc.). Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2012-September\/053792.html."},{"key":"e_1_2_1_67_1","unstructured":"LLVM Developer List. 2015. [LLVMdev] LLVM Parallel IR. Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2015-March\/083314.html.  LLVM Developer List. 2015. [LLVMdev] LLVM Parallel IR. Retrieved from http:\/\/lists.llvm.org\/pipermail\/llvm-dev\/2015-March\/083314.html."},{"key":"e_1_2_1_68_1","unstructured":"LLVM Project. 2015. OpenMP: Support for the OpenMP Language. Retrieved from http:\/\/openmp.llvm.org\/.  LLVM Project. 2015. OpenMP: Support for the OpenMP Language. Retrieved from http:\/\/openmp.llvm.org\/."},{"key":"e_1_2_1_69_1","unstructured":"LLVM Project. 2018. Exception Handling in LLVM. Retrieved from https:\/\/llvm.org\/docs\/ExceptionHandling.html.  LLVM Project. 2018. Exception Handling in LLVM. Retrieved from https:\/\/llvm.org\/docs\/ExceptionHandling.html."},{"key":"e_1_2_1_70_1","unstructured":"LLVM Project. 2018. LLVM Language Reference Manual. Retrieved from http:\/\/llvm.org\/docs\/LangRef.html.  LLVM Project. 2018. LLVM Language Reference Manual. Retrieved from http:\/\/llvm.org\/docs\/LangRef.html."},{"key":"e_1_2_1_71_1","unstructured":"LLVM Project. 2018. LLVM\u2019s Analysis and Transform Passes. Retrieved from http:\/\/llvm.org\/docs\/Passes.html.  LLVM Project. 2018. LLVM\u2019s Analysis and Transform Passes. Retrieved from http:\/\/llvm.org\/docs\/Passes.html."},{"key":"e_1_2_1_72_1","volume-title":"Structured Parallel Programming: Patterns for Efficient Computation","author":"McCool Michael"},{"key":"e_1_2_1_73_1","unstructured":"Don McCrady. 2008. Avoiding Contention Using Combinable Objects. Microsoft Developer Network blog post. Retrieved from http:\/\/blogs.msdn.com\/nativeconcurrency\/archive\/2008\/09\/25\/avoiding-contention-using-combinable-objects.aspx.  Don McCrady. 2008. Avoiding Contention Using Combinable Objects. Microsoft Developer Network blog post. Retrieved from http:\/\/blogs.msdn.com\/nativeconcurrency\/archive\/2008\/09\/25\/avoiding-contention-using-combinable-objects.aspx."},{"key":"e_1_2_1_74_1","volume-title":"Padua","author":"Midkiff Samuel P.","year":"1990"},{"key":"e_1_2_1_75_1","volume-title":"Programming from Specifications","author":"Morgan Carroll","edition":"2"},{"key":"e_1_2_1_77_1","unstructured":"Steven S. Muchnick. 1997. Advanced Compiler Design and Implementation. Morgan Kaufmann.  Steven S. Muchnick. 1997. Advanced Compiler Design and Implementation. Morgan Kaufmann."},{"key":"e_1_2_1_78_1","doi-asserted-by":"publisher","DOI":"10.1109\/PACT.2009.28"},{"key":"e_1_2_1_79_1","doi-asserted-by":"publisher","DOI":"10.1145\/130616.130623"},{"key":"e_1_2_1_80_1","doi-asserted-by":"publisher","DOI":"10.1109\/ICPP.1998.708506"},{"key":"e_1_2_1_81_1","doi-asserted-by":"publisher","DOI":"10.1145\/1508244.1508256"},{"key":"e_1_2_1_82_1","unstructured":"OpenMP Architecture Review Board. 2015. OpenMP Application Program Interface Version 4.5. Retrieved from http:\/\/www.openmp.org\/wp-content\/uploads\/openmp-4.5.pdf.  OpenMP Architecture Review Board. 2015. OpenMP Application Program Interface Version 4.5. Retrieved from http:\/\/www.openmp.org\/wp-content\/uploads\/openmp-4.5.pdf."},{"key":"e_1_2_1_83_1","doi-asserted-by":"publisher","DOI":"10.1145\/1344551.1344561"},{"key":"e_1_2_1_84_1","doi-asserted-by":"publisher","DOI":"10.1145\/1993498.1993501"},{"key":"e_1_2_1_85_1","volume-title":"Proceedings of CPC.","author":"Pop Antoniu","year":"2010"},{"key":"e_1_2_1_86_1","doi-asserted-by":"publisher","DOI":"10.1145\/304065.304106"},{"key":"e_1_2_1_87_1","doi-asserted-by":"publisher","DOI":"10.1109\/PDP.2009.43"},{"key":"e_1_2_1_88_1","volume-title":"Intel Threading Building Blocks: Outfitting C++ for Multi-core Processor Parallelism. O\u2019Reilly Media","author":"Reinders James"},{"key":"e_1_2_1_89_1","first-page":"1","article-title":"Three layer cake for shared-memory programming","volume":"5","author":"Robison Arch D.","year":"2010","journal-title":"Proceedings of ParaPLoP."},{"key":"e_1_2_1_90_1","doi-asserted-by":"publisher","DOI":"10.1145\/349299.349327"},{"key":"e_1_2_1_91_1","doi-asserted-by":"publisher","DOI":"10.1145\/596980.596982"},{"key":"e_1_2_1_92_1","volume-title":"Proceedings of LCPC. 94--113","author":"Sarkar Vivek","year":"1998"},{"key":"e_1_2_1_93_1","doi-asserted-by":"publisher","DOI":"10.1007\/3-540-57659-2_36"},{"key":"e_1_2_1_95_1","doi-asserted-by":"publisher","DOI":"10.1145\/3154502"},{"key":"e_1_2_1_96_1","volume-title":"William M. Leiserson, and Charles E. Leiserson.","author":"Schardl Tao B.","year":"2015"},{"key":"e_1_2_1_97_1","volume-title":"Leiserson","author":"Schardl Tao B.","year":"2017"},{"key":"e_1_2_1_98_1","volume-title":"Proceedings of IPDPS.","author":"Shirako J."},{"key":"e_1_2_1_99_1","volume-title":"Gibbons","author":"Shun Julian","year":"2013"},{"key":"e_1_2_1_100_1","doi-asserted-by":"publisher","DOI":"10.1145\/2312005.2312018"},{"key":"e_1_2_1_102_1","doi-asserted-by":"publisher","DOI":"10.1145\/158511.158644"},{"key":"e_1_2_1_103_1","volume-title":"Proceedings of LCPC. 405--419","author":"Srinivasan Harini","year":"1991"},{"key":"e_1_2_1_104_1","volume-title":"Stallman and the GCC Developer Community","author":"Richard","year":"2016"},{"key":"e_1_2_1_105_1","doi-asserted-by":"publisher","DOI":"10.1145\/96709.96731"},{"key":"e_1_2_1_106_1","doi-asserted-by":"publisher","DOI":"10.1145\/3148173.3148186"},{"key":"e_1_2_1_107_1","volume-title":"The C++ Programming Language","author":"Stroustrup Bjarne","edition":"4"},{"key":"e_1_2_1_108_1","doi-asserted-by":"publisher","DOI":"10.1145\/2935764.2935801"},{"key":"e_1_2_1_109_1","doi-asserted-by":"publisher","DOI":"10.1145\/2676726.2676995"},{"key":"e_1_2_1_110_1","doi-asserted-by":"publisher","DOI":"10.1016\/S1571-0661(04)00270-1"},{"key":"e_1_2_1_111_1","doi-asserted-by":"publisher","DOI":"10.1109\/IPDPS.2013.10"},{"key":"e_1_2_1_112_1","doi-asserted-by":"publisher","DOI":"10.1145\/1555754.1555796"},{"key":"e_1_2_1_113_1","doi-asserted-by":"publisher","DOI":"10.1145\/2095050.2095103"}],"container-title":["ACM Transactions on Parallel Computing"],"original-title":[],"language":"en","link":[{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3365655","content-type":"unspecified","content-version":"vor","intended-application":"text-mining"},{"URL":"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3365655","content-type":"application\/pdf","content-version":"vor","intended-application":"syndication"},{"URL":"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3365655","content-type":"unspecified","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2025,6,17]],"date-time":"2025-06-17T23:44:21Z","timestamp":1750203861000},"score":1,"resource":{"primary":{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3365655"}},"subtitle":["Embedding Recursive Fork-join Parallelism into LLVM\u2019s Intermediate Representation"],"short-title":[],"issued":{"date-parts":[[2019,12,17]]},"references-count":106,"journal-issue":{"issue":"4","published-print":{"date-parts":[[2019,12,31]]}},"alternative-id":["10.1145\/3365655"],"URL":"https:\/\/doi.org\/10.1145\/3365655","relation":{},"ISSN":["2329-4949","2329-4957"],"issn-type":[{"value":"2329-4949","type":"print"},{"value":"2329-4957","type":"electronic"}],"subject":[],"published":{"date-parts":[[2019,12,17]]},"assertion":[{"value":"2018-04-01","order":0,"name":"received","label":"Received","group":{"name":"publication_history","label":"Publication History"}},{"value":"2019-04-01","order":1,"name":"accepted","label":"Accepted","group":{"name":"publication_history","label":"Publication History"}},{"value":"2019-12-17","order":2,"name":"published","label":"Published","group":{"name":"publication_history","label":"Publication History"}}]}}