<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*-<a name="line.1"></a>
<span class="sourceLineNo">002</span> *******************************************************************************<a name="line.2"></a>
<span class="sourceLineNo">003</span> * Copyright (c) 2011, 2016 Diamond Light Source Ltd.<a name="line.3"></a>
<span class="sourceLineNo">004</span> * All rights reserved. This program and the accompanying materials<a name="line.4"></a>
<span class="sourceLineNo">005</span> * are made available under the terms of the Eclipse Public License v1.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * which accompanies this distribution, and is available at<a name="line.6"></a>
<span class="sourceLineNo">007</span> * http://www.eclipse.org/legal/epl-v10.html<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> * Contributors:<a name="line.9"></a>
<span class="sourceLineNo">010</span> *    Peter Chang - initial API and implementation and/or initial documentation<a name="line.10"></a>
<span class="sourceLineNo">011</span> *******************************************************************************/<a name="line.11"></a>
<span class="sourceLineNo">012</span><a name="line.12"></a>
<span class="sourceLineNo">013</span>package org.eclipse.january.dataset;<a name="line.13"></a>
<span class="sourceLineNo">014</span><a name="line.14"></a>
<span class="sourceLineNo">015</span>import java.util.ArrayList;<a name="line.15"></a>
<span class="sourceLineNo">016</span>import java.util.List;<a name="line.16"></a>
<span class="sourceLineNo">017</span><a name="line.17"></a>
<span class="sourceLineNo">018</span>/**<a name="line.18"></a>
<span class="sourceLineNo">019</span> * Comparison and logical methods<a name="line.19"></a>
<span class="sourceLineNo">020</span> */<a name="line.20"></a>
<span class="sourceLineNo">021</span>public class Comparisons {<a name="line.21"></a>
<span class="sourceLineNo">022</span>        /**<a name="line.22"></a>
<span class="sourceLineNo">023</span>         * Compare item-wise for whether a's element is equal b's<a name="line.23"></a>
<span class="sourceLineNo">024</span>         * &lt;p&gt;<a name="line.24"></a>
<span class="sourceLineNo">025</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.25"></a>
<span class="sourceLineNo">026</span>         * are equal. Where the datasets have mismatched item sizes, the first element<a name="line.26"></a>
<span class="sourceLineNo">027</span>         * of the dataset with smaller items is used for comparison.<a name="line.27"></a>
<span class="sourceLineNo">028</span>         * @param a<a name="line.28"></a>
<span class="sourceLineNo">029</span>         * @param b<a name="line.29"></a>
<span class="sourceLineNo">030</span>         * @return dataset where item is true if {@code a == b}<a name="line.30"></a>
<span class="sourceLineNo">031</span>         */<a name="line.31"></a>
<span class="sourceLineNo">032</span>        public static BooleanDataset equalTo(Object a, Object b) {<a name="line.32"></a>
<span class="sourceLineNo">033</span>                return equalTo(a, b, null);<a name="line.33"></a>
<span class="sourceLineNo">034</span>        }<a name="line.34"></a>
<span class="sourceLineNo">035</span><a name="line.35"></a>
<span class="sourceLineNo">036</span>        /**<a name="line.36"></a>
<span class="sourceLineNo">037</span>         * Compare item-wise for whether a's element is equal b's<a name="line.37"></a>
<span class="sourceLineNo">038</span>         * &lt;p&gt;<a name="line.38"></a>
<span class="sourceLineNo">039</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.39"></a>
<span class="sourceLineNo">040</span>         * are equal. Where the datasets have mismatched item sizes, the first element<a name="line.40"></a>
<span class="sourceLineNo">041</span>         * of the dataset with smaller items is used for comparison.<a name="line.41"></a>
<span class="sourceLineNo">042</span>         * @param a<a name="line.42"></a>
<span class="sourceLineNo">043</span>         * @param b<a name="line.43"></a>
<span class="sourceLineNo">044</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.44"></a>
<span class="sourceLineNo">045</span>         * @return dataset where item is true if {@code a == b}<a name="line.45"></a>
<span class="sourceLineNo">046</span>         */<a name="line.46"></a>
<span class="sourceLineNo">047</span>        public static BooleanDataset equalTo(Object a, Object b, BooleanDataset o) {<a name="line.47"></a>
<span class="sourceLineNo">048</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.48"></a>
<span class="sourceLineNo">049</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.49"></a>
<span class="sourceLineNo">050</span><a name="line.50"></a>
<span class="sourceLineNo">051</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.51"></a>
<span class="sourceLineNo">052</span><a name="line.52"></a>
<span class="sourceLineNo">053</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.55"></a>
<span class="sourceLineNo">056</span>                final int as = da.getElementsPerItem();<a name="line.56"></a>
<span class="sourceLineNo">057</span>                final int bs = db.getElementsPerItem();<a name="line.57"></a>
<span class="sourceLineNo">058</span><a name="line.58"></a>
<span class="sourceLineNo">059</span>                if (as &gt; bs) {<a name="line.59"></a>
<span class="sourceLineNo">060</span>                        if (da.isComplex()) {<a name="line.60"></a>
<span class="sourceLineNo">061</span>                                while (it.hasNext()) {<a name="line.61"></a>
<span class="sourceLineNo">062</span>                                        final double bd = it.bDouble;<a name="line.62"></a>
<span class="sourceLineNo">063</span>                                        boolean rb = it.aDouble == bd &amp;&amp; da.getElementDoubleAbs(it.aIndex + 1) == 0;<a name="line.63"></a>
<span class="sourceLineNo">064</span>                                        r.setAbs(it.oIndex, rb);<a name="line.64"></a>
<span class="sourceLineNo">065</span>                                }<a name="line.65"></a>
<span class="sourceLineNo">066</span>                        } else if (it.isOutputDouble()) {<a name="line.66"></a>
<span class="sourceLineNo">067</span>                                while (it.hasNext()) {<a name="line.67"></a>
<span class="sourceLineNo">068</span>                                        final double bd = it.bDouble;<a name="line.68"></a>
<span class="sourceLineNo">069</span>                                        boolean rb = true;<a name="line.69"></a>
<span class="sourceLineNo">070</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.70"></a>
<span class="sourceLineNo">071</span>                                                rb &amp;= da.getElementDoubleAbs(it.aIndex + j) == bd;<a name="line.71"></a>
<span class="sourceLineNo">072</span>                                        }<a name="line.72"></a>
<span class="sourceLineNo">073</span>                                        r.setAbs(it.oIndex, rb);<a name="line.73"></a>
<span class="sourceLineNo">074</span>                                }<a name="line.74"></a>
<span class="sourceLineNo">075</span>                        } else {<a name="line.75"></a>
<span class="sourceLineNo">076</span>                                while (it.hasNext()) {<a name="line.76"></a>
<span class="sourceLineNo">077</span>                                        final long bl = it.bLong;<a name="line.77"></a>
<span class="sourceLineNo">078</span>                                        boolean rb = true;<a name="line.78"></a>
<span class="sourceLineNo">079</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.79"></a>
<span class="sourceLineNo">080</span>                                                rb &amp;= da.getElementLongAbs(it.aIndex + j) == bl;<a name="line.80"></a>
<span class="sourceLineNo">081</span>                                        }<a name="line.81"></a>
<span class="sourceLineNo">082</span>                                        r.setAbs(it.oIndex, rb);<a name="line.82"></a>
<span class="sourceLineNo">083</span>                                }<a name="line.83"></a>
<span class="sourceLineNo">084</span>                        }<a name="line.84"></a>
<span class="sourceLineNo">085</span>                } else if (as &lt; bs) {<a name="line.85"></a>
<span class="sourceLineNo">086</span>                        if (db.isComplex()) {<a name="line.86"></a>
<span class="sourceLineNo">087</span>                                while (it.hasNext()) {<a name="line.87"></a>
<span class="sourceLineNo">088</span>                                        final double ad = it.aDouble;<a name="line.88"></a>
<span class="sourceLineNo">089</span>                                        boolean rb = ad == it.bDouble &amp;&amp; 0 == db.getElementDoubleAbs(it.bIndex + 1);<a name="line.89"></a>
<span class="sourceLineNo">090</span>                                        r.setAbs(it.oIndex, rb);<a name="line.90"></a>
<span class="sourceLineNo">091</span>                                }<a name="line.91"></a>
<span class="sourceLineNo">092</span>                        } else if (it.isOutputDouble()) {<a name="line.92"></a>
<span class="sourceLineNo">093</span>                                while (it.hasNext()) {<a name="line.93"></a>
<span class="sourceLineNo">094</span>                                        final double ad = it.aDouble;<a name="line.94"></a>
<span class="sourceLineNo">095</span>                                        boolean rb = true;<a name="line.95"></a>
<span class="sourceLineNo">096</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.96"></a>
<span class="sourceLineNo">097</span>                                                rb &amp;= ad == db.getElementDoubleAbs(it.bIndex + j);<a name="line.97"></a>
<span class="sourceLineNo">098</span>                                        }<a name="line.98"></a>
<span class="sourceLineNo">099</span>                                        r.setAbs(it.oIndex, rb);<a name="line.99"></a>
<span class="sourceLineNo">100</span>                                }<a name="line.100"></a>
<span class="sourceLineNo">101</span>                        } else {<a name="line.101"></a>
<span class="sourceLineNo">102</span>                                while (it.hasNext()) {<a name="line.102"></a>
<span class="sourceLineNo">103</span>                                        final long al = it.aLong;<a name="line.103"></a>
<span class="sourceLineNo">104</span>                                        boolean rb = true;<a name="line.104"></a>
<span class="sourceLineNo">105</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.105"></a>
<span class="sourceLineNo">106</span>                                                rb &amp;= al == db.getElementLongAbs(it.bIndex + j);<a name="line.106"></a>
<span class="sourceLineNo">107</span>                                        }<a name="line.107"></a>
<span class="sourceLineNo">108</span>                                        r.setAbs(it.oIndex, rb);<a name="line.108"></a>
<span class="sourceLineNo">109</span>                                }<a name="line.109"></a>
<span class="sourceLineNo">110</span>                        }<a name="line.110"></a>
<span class="sourceLineNo">111</span>                } else {<a name="line.111"></a>
<span class="sourceLineNo">112</span>                        if (as == 1) {<a name="line.112"></a>
<span class="sourceLineNo">113</span>                                if (it.isOutputDouble()) {<a name="line.113"></a>
<span class="sourceLineNo">114</span>                                        while (it.hasNext()) {<a name="line.114"></a>
<span class="sourceLineNo">115</span>                                                r.setAbs(it.oIndex, it.aDouble == it.bDouble);<a name="line.115"></a>
<span class="sourceLineNo">116</span>                                        }<a name="line.116"></a>
<span class="sourceLineNo">117</span>                                } else {<a name="line.117"></a>
<span class="sourceLineNo">118</span>                                        while (it.hasNext()) {<a name="line.118"></a>
<span class="sourceLineNo">119</span>                                                r.setAbs(it.oIndex, it.aLong == it.bLong);<a name="line.119"></a>
<span class="sourceLineNo">120</span>                                        }<a name="line.120"></a>
<span class="sourceLineNo">121</span>                                }<a name="line.121"></a>
<span class="sourceLineNo">122</span>                        } else if (it.isOutputDouble()) {<a name="line.122"></a>
<span class="sourceLineNo">123</span>                                while (it.hasNext()) {<a name="line.123"></a>
<span class="sourceLineNo">124</span>                                        boolean rb = true;<a name="line.124"></a>
<span class="sourceLineNo">125</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.125"></a>
<span class="sourceLineNo">126</span>                                                rb &amp;= da.getElementDoubleAbs(it.aIndex + j) == db.getElementDoubleAbs(it.bIndex + j);<a name="line.126"></a>
<span class="sourceLineNo">127</span>                                        }<a name="line.127"></a>
<span class="sourceLineNo">128</span>                                        r.setAbs(it.oIndex, rb);<a name="line.128"></a>
<span class="sourceLineNo">129</span>                                }<a name="line.129"></a>
<span class="sourceLineNo">130</span>                        } else {<a name="line.130"></a>
<span class="sourceLineNo">131</span>                                while (it.hasNext()) {<a name="line.131"></a>
<span class="sourceLineNo">132</span>                                        boolean rb = true;<a name="line.132"></a>
<span class="sourceLineNo">133</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.133"></a>
<span class="sourceLineNo">134</span>                                                rb &amp;= da.getElementLongAbs(it.aIndex + j) == db.getElementLongAbs(it.bIndex + j);<a name="line.134"></a>
<span class="sourceLineNo">135</span>                                        }<a name="line.135"></a>
<span class="sourceLineNo">136</span>                                        r.setAbs(it.oIndex, rb);<a name="line.136"></a>
<span class="sourceLineNo">137</span>                                }<a name="line.137"></a>
<span class="sourceLineNo">138</span>                        }<a name="line.138"></a>
<span class="sourceLineNo">139</span>                }<a name="line.139"></a>
<span class="sourceLineNo">140</span><a name="line.140"></a>
<span class="sourceLineNo">141</span>                return r;<a name="line.141"></a>
<span class="sourceLineNo">142</span>        }<a name="line.142"></a>
<span class="sourceLineNo">143</span><a name="line.143"></a>
<span class="sourceLineNo">144</span>        /**<a name="line.144"></a>
<span class="sourceLineNo">145</span>         * Compare item-wise for whether a's element is equal b's<a name="line.145"></a>
<span class="sourceLineNo">146</span>         * &lt;p&gt;<a name="line.146"></a>
<span class="sourceLineNo">147</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.147"></a>
<span class="sourceLineNo">148</span>         * are equal. Where the datasets have mismatched item sizes, the first element<a name="line.148"></a>
<span class="sourceLineNo">149</span>         * of the dataset with smaller items is used for comparison.<a name="line.149"></a>
<span class="sourceLineNo">150</span>         * @param a<a name="line.150"></a>
<span class="sourceLineNo">151</span>         * @param b<a name="line.151"></a>
<span class="sourceLineNo">152</span>         * @param relTolerance<a name="line.152"></a>
<span class="sourceLineNo">153</span>         * @param absTolerance<a name="line.153"></a>
<span class="sourceLineNo">154</span>         * @return dataset where item is true if {@code abs(a - b) &lt;= absTol + relTol*max(abs(a),abs(b))}<a name="line.154"></a>
<span class="sourceLineNo">155</span>         */<a name="line.155"></a>
<span class="sourceLineNo">156</span>        public static BooleanDataset almostEqualTo(Object a, Object b, double relTolerance, double absTolerance) {<a name="line.156"></a>
<span class="sourceLineNo">157</span>                return almostEqualTo(a, b, null, relTolerance, absTolerance);<a name="line.157"></a>
<span class="sourceLineNo">158</span>        }<a name="line.158"></a>
<span class="sourceLineNo">159</span><a name="line.159"></a>
<span class="sourceLineNo">160</span>        /**<a name="line.160"></a>
<span class="sourceLineNo">161</span>         * <a name="line.161"></a>
<span class="sourceLineNo">162</span>         * @param a<a name="line.162"></a>
<span class="sourceLineNo">163</span>         * @param b<a name="line.163"></a>
<span class="sourceLineNo">164</span>         * @param relTol<a name="line.164"></a>
<span class="sourceLineNo">165</span>         * @param absTol<a name="line.165"></a>
<span class="sourceLineNo">166</span>         * @return true if {@code abs(a - b) &lt;= max(absTol, relTol*max(abs(a),abs(b)))}<a name="line.166"></a>
<span class="sourceLineNo">167</span>         */<a name="line.167"></a>
<span class="sourceLineNo">168</span>        public final static boolean isClose(double a, double b, double relTol, double absTol) {<a name="line.168"></a>
<span class="sourceLineNo">169</span>                return Math.abs(a - b) &lt;= Math.max(absTol, relTol * Math.max(Math.abs(a), Math.abs(b)));<a name="line.169"></a>
<span class="sourceLineNo">170</span>        }<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span>        private final static boolean isCloseNP(double a, double b, double rt, double at) {<a name="line.172"></a>
<span class="sourceLineNo">173</span>                return Math.abs(a - b) &lt;= at + rt * Math.max(Math.abs(a), Math.abs(b));<a name="line.173"></a>
<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
<span class="sourceLineNo">175</span><a name="line.175"></a>
<span class="sourceLineNo">176</span>        private final static boolean isCloseNP(double a, double rt, double at) {<a name="line.176"></a>
<span class="sourceLineNo">177</span>                double aa = Math.abs(a);<a name="line.177"></a>
<span class="sourceLineNo">178</span>                return aa &lt;= at + rt * aa;<a name="line.178"></a>
<span class="sourceLineNo">179</span>        }<a name="line.179"></a>
<span class="sourceLineNo">180</span><a name="line.180"></a>
<span class="sourceLineNo">181</span>        /**<a name="line.181"></a>
<span class="sourceLineNo">182</span>         * Compare item-wise for whether a's element is equal b's<a name="line.182"></a>
<span class="sourceLineNo">183</span>         * &lt;p&gt;<a name="line.183"></a>
<span class="sourceLineNo">184</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.184"></a>
<span class="sourceLineNo">185</span>         * are equal. Where the datasets have mismatched item sizes, the first element<a name="line.185"></a>
<span class="sourceLineNo">186</span>         * of the dataset with smaller items is used for comparison.<a name="line.186"></a>
<span class="sourceLineNo">187</span>         * @param a<a name="line.187"></a>
<span class="sourceLineNo">188</span>         * @param b<a name="line.188"></a>
<span class="sourceLineNo">189</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.189"></a>
<span class="sourceLineNo">190</span>         * @param relTolerance<a name="line.190"></a>
<span class="sourceLineNo">191</span>         * @param absTolerance<a name="line.191"></a>
<span class="sourceLineNo">192</span>         * @return dataset where item is true if {@code abs(a - b) &lt;= absTol + relTol*max(abs(a),abs(b))}<a name="line.192"></a>
<span class="sourceLineNo">193</span>         */<a name="line.193"></a>
<span class="sourceLineNo">194</span>        public static BooleanDataset almostEqualTo(Object a, Object b, BooleanDataset o, double relTolerance, double absTolerance) {<a name="line.194"></a>
<span class="sourceLineNo">195</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.195"></a>
<span class="sourceLineNo">196</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.196"></a>
<span class="sourceLineNo">197</span><a name="line.197"></a>
<span class="sourceLineNo">198</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.198"></a>
<span class="sourceLineNo">199</span><a name="line.199"></a>
<span class="sourceLineNo">200</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.200"></a>
<span class="sourceLineNo">201</span><a name="line.201"></a>
<span class="sourceLineNo">202</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.202"></a>
<span class="sourceLineNo">203</span>                it.setOutputDouble(true);<a name="line.203"></a>
<span class="sourceLineNo">204</span>                final int as = da.getElementsPerItem();<a name="line.204"></a>
<span class="sourceLineNo">205</span>                final int bs = db.getElementsPerItem();<a name="line.205"></a>
<span class="sourceLineNo">206</span><a name="line.206"></a>
<span class="sourceLineNo">207</span>                if (as &gt; bs) {<a name="line.207"></a>
<span class="sourceLineNo">208</span>                        if (da.isComplex()) {<a name="line.208"></a>
<span class="sourceLineNo">209</span>                                while (it.hasNext()) {<a name="line.209"></a>
<span class="sourceLineNo">210</span>                                        boolean rb = isCloseNP(it.aDouble, it.bDouble, relTolerance, absTolerance);<a name="line.210"></a>
<span class="sourceLineNo">211</span>                                        if (rb) {<a name="line.211"></a>
<span class="sourceLineNo">212</span>                                                rb = isCloseNP(da.getElementDoubleAbs(it.aIndex + 1), relTolerance, absTolerance);<a name="line.212"></a>
<span class="sourceLineNo">213</span>                                        }<a name="line.213"></a>
<span class="sourceLineNo">214</span>                                        r.setAbs(it.oIndex, rb);<a name="line.214"></a>
<span class="sourceLineNo">215</span>                                }<a name="line.215"></a>
<span class="sourceLineNo">216</span>                        } else {<a name="line.216"></a>
<span class="sourceLineNo">217</span>                                while (it.hasNext()) {<a name="line.217"></a>
<span class="sourceLineNo">218</span>                                        final double bd = it.bDouble;<a name="line.218"></a>
<span class="sourceLineNo">219</span>                                        boolean rb = true;<a name="line.219"></a>
<span class="sourceLineNo">220</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.220"></a>
<span class="sourceLineNo">221</span>                                                rb &amp;= isCloseNP(da.getElementDoubleAbs(it.aIndex + j), bd, relTolerance, absTolerance);<a name="line.221"></a>
<span class="sourceLineNo">222</span>                                        }<a name="line.222"></a>
<span class="sourceLineNo">223</span>                                        r.setAbs(it.oIndex, rb);<a name="line.223"></a>
<span class="sourceLineNo">224</span>                                }<a name="line.224"></a>
<span class="sourceLineNo">225</span>                        }<a name="line.225"></a>
<span class="sourceLineNo">226</span>                } else if (as &lt; bs) {<a name="line.226"></a>
<span class="sourceLineNo">227</span>                        if (db.isComplex()) {<a name="line.227"></a>
<span class="sourceLineNo">228</span>                                while (it.hasNext()) {<a name="line.228"></a>
<span class="sourceLineNo">229</span>                                        boolean rb = isCloseNP(it.aDouble, it.bDouble, relTolerance, absTolerance);<a name="line.229"></a>
<span class="sourceLineNo">230</span>                                        if (rb) {<a name="line.230"></a>
<span class="sourceLineNo">231</span>                                                rb = isCloseNP(db.getElementDoubleAbs(it.bIndex + 1), relTolerance, absTolerance);<a name="line.231"></a>
<span class="sourceLineNo">232</span>                                        }<a name="line.232"></a>
<span class="sourceLineNo">233</span>                                        r.setAbs(it.oIndex, rb);<a name="line.233"></a>
<span class="sourceLineNo">234</span>                                }<a name="line.234"></a>
<span class="sourceLineNo">235</span>                        } else {<a name="line.235"></a>
<span class="sourceLineNo">236</span>                                while (it.hasNext()) {<a name="line.236"></a>
<span class="sourceLineNo">237</span>                                        final double ad = it.aDouble;<a name="line.237"></a>
<span class="sourceLineNo">238</span>                                        boolean rb = true;<a name="line.238"></a>
<span class="sourceLineNo">239</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.239"></a>
<span class="sourceLineNo">240</span>                                                rb &amp;= isCloseNP(ad, db.getElementDoubleAbs(it.bIndex + j), relTolerance, absTolerance);<a name="line.240"></a>
<span class="sourceLineNo">241</span>                                        }<a name="line.241"></a>
<span class="sourceLineNo">242</span>                                        r.setAbs(it.oIndex, rb);<a name="line.242"></a>
<span class="sourceLineNo">243</span>                                }<a name="line.243"></a>
<span class="sourceLineNo">244</span>                        }<a name="line.244"></a>
<span class="sourceLineNo">245</span>                } else {<a name="line.245"></a>
<span class="sourceLineNo">246</span>                        if (as == 1) {<a name="line.246"></a>
<span class="sourceLineNo">247</span>                                while (it.hasNext()) {<a name="line.247"></a>
<span class="sourceLineNo">248</span>                                        r.setAbs(it.oIndex, isCloseNP(it.aDouble, it.bDouble, relTolerance, absTolerance));<a name="line.248"></a>
<span class="sourceLineNo">249</span>                                }<a name="line.249"></a>
<span class="sourceLineNo">250</span>                        } else {<a name="line.250"></a>
<span class="sourceLineNo">251</span>                                while (it.hasNext()) {<a name="line.251"></a>
<span class="sourceLineNo">252</span>                                        boolean rb = isCloseNP(it.aDouble, it.bDouble, relTolerance, absTolerance);<a name="line.252"></a>
<span class="sourceLineNo">253</span>                                        for (int j = 1; rb &amp;&amp; j &lt; bs; j++) {<a name="line.253"></a>
<span class="sourceLineNo">254</span>                                                rb &amp;= isCloseNP(da.getElementDoubleAbs(it.aIndex + j), db.getElementDoubleAbs(it.bIndex + j), relTolerance, absTolerance);<a name="line.254"></a>
<span class="sourceLineNo">255</span>                                        }<a name="line.255"></a>
<span class="sourceLineNo">256</span>                                        r.setAbs(it.oIndex, rb);<a name="line.256"></a>
<span class="sourceLineNo">257</span>                                }<a name="line.257"></a>
<span class="sourceLineNo">258</span>                        }<a name="line.258"></a>
<span class="sourceLineNo">259</span>                }<a name="line.259"></a>
<span class="sourceLineNo">260</span>                <a name="line.260"></a>
<span class="sourceLineNo">261</span>                return r;<a name="line.261"></a>
<span class="sourceLineNo">262</span>        }<a name="line.262"></a>
<span class="sourceLineNo">263</span><a name="line.263"></a>
<span class="sourceLineNo">264</span>        /**<a name="line.264"></a>
<span class="sourceLineNo">265</span>         * Compare item-wise for whether a's element is greater than b's<a name="line.265"></a>
<span class="sourceLineNo">266</span>         * &lt;p&gt;<a name="line.266"></a>
<span class="sourceLineNo">267</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.267"></a>
<span class="sourceLineNo">268</span>         * are greater. Where the datasets have mismatched item sizes, the first element<a name="line.268"></a>
<span class="sourceLineNo">269</span>         * of the dataset with smaller items is used for comparison.<a name="line.269"></a>
<span class="sourceLineNo">270</span>         * @param a<a name="line.270"></a>
<span class="sourceLineNo">271</span>         * @param b<a name="line.271"></a>
<span class="sourceLineNo">272</span>         * @return dataset where item is true if {@code a &gt; b}<a name="line.272"></a>
<span class="sourceLineNo">273</span>         */<a name="line.273"></a>
<span class="sourceLineNo">274</span>        public static BooleanDataset greaterThan(Object a, Object b) {<a name="line.274"></a>
<span class="sourceLineNo">275</span>                return greaterThan(a, b, null);<a name="line.275"></a>
<span class="sourceLineNo">276</span>        }<a name="line.276"></a>
<span class="sourceLineNo">277</span><a name="line.277"></a>
<span class="sourceLineNo">278</span>        /**<a name="line.278"></a>
<span class="sourceLineNo">279</span>         * Compare item-wise for whether a's element is greater than b's<a name="line.279"></a>
<span class="sourceLineNo">280</span>         * &lt;p&gt;<a name="line.280"></a>
<span class="sourceLineNo">281</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.281"></a>
<span class="sourceLineNo">282</span>         * are greater. Where the datasets have mismatched item sizes, the first element<a name="line.282"></a>
<span class="sourceLineNo">283</span>         * of the dataset with smaller items is used for comparison.<a name="line.283"></a>
<span class="sourceLineNo">284</span>         * @param a<a name="line.284"></a>
<span class="sourceLineNo">285</span>         * @param b<a name="line.285"></a>
<span class="sourceLineNo">286</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.286"></a>
<span class="sourceLineNo">287</span>         * @return dataset where item is true if {@code a &gt; b}<a name="line.287"></a>
<span class="sourceLineNo">288</span>         */<a name="line.288"></a>
<span class="sourceLineNo">289</span>        public static BooleanDataset greaterThan(Object a, Object b, BooleanDataset o) {<a name="line.289"></a>
<span class="sourceLineNo">290</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.290"></a>
<span class="sourceLineNo">291</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.291"></a>
<span class="sourceLineNo">292</span><a name="line.292"></a>
<span class="sourceLineNo">293</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.293"></a>
<span class="sourceLineNo">294</span><a name="line.294"></a>
<span class="sourceLineNo">295</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.295"></a>
<span class="sourceLineNo">296</span><a name="line.296"></a>
<span class="sourceLineNo">297</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.297"></a>
<span class="sourceLineNo">298</span>                final int as = da.getElementsPerItem();<a name="line.298"></a>
<span class="sourceLineNo">299</span>                final int bs = db.getElementsPerItem();<a name="line.299"></a>
<span class="sourceLineNo">300</span><a name="line.300"></a>
<span class="sourceLineNo">301</span>                if (it.isOutputDouble()) {<a name="line.301"></a>
<span class="sourceLineNo">302</span>                        if (as &gt; bs) {<a name="line.302"></a>
<span class="sourceLineNo">303</span>                                while (it.hasNext()) {<a name="line.303"></a>
<span class="sourceLineNo">304</span>                                        final double bd = it.bDouble;<a name="line.304"></a>
<span class="sourceLineNo">305</span>                                        boolean rb = true;<a name="line.305"></a>
<span class="sourceLineNo">306</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.306"></a>
<span class="sourceLineNo">307</span>                                                rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &gt; bd;<a name="line.307"></a>
<span class="sourceLineNo">308</span>                                        }<a name="line.308"></a>
<span class="sourceLineNo">309</span>                                        r.setAbs(it.oIndex, rb);<a name="line.309"></a>
<span class="sourceLineNo">310</span>                                }<a name="line.310"></a>
<span class="sourceLineNo">311</span>                        } else if (as &lt; bs) {<a name="line.311"></a>
<span class="sourceLineNo">312</span>                                while (it.hasNext()) {<a name="line.312"></a>
<span class="sourceLineNo">313</span>                                        final double ad = it.aDouble;<a name="line.313"></a>
<span class="sourceLineNo">314</span>                                        boolean rb = true;<a name="line.314"></a>
<span class="sourceLineNo">315</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.315"></a>
<span class="sourceLineNo">316</span>                                                rb &amp;= ad &gt; db.getElementDoubleAbs(it.bIndex + j);<a name="line.316"></a>
<span class="sourceLineNo">317</span>                                        }<a name="line.317"></a>
<span class="sourceLineNo">318</span>                                        r.setAbs(it.oIndex, rb);<a name="line.318"></a>
<span class="sourceLineNo">319</span>                                }<a name="line.319"></a>
<span class="sourceLineNo">320</span>                        } else {<a name="line.320"></a>
<span class="sourceLineNo">321</span>                                if (as == 1) {<a name="line.321"></a>
<span class="sourceLineNo">322</span>                                        while (it.hasNext()) {<a name="line.322"></a>
<span class="sourceLineNo">323</span>                                                r.setAbs(it.oIndex, it.aDouble &gt; it.bDouble);<a name="line.323"></a>
<span class="sourceLineNo">324</span>                                        }<a name="line.324"></a>
<span class="sourceLineNo">325</span>                                } else {<a name="line.325"></a>
<span class="sourceLineNo">326</span>                                        while (it.hasNext()) {<a name="line.326"></a>
<span class="sourceLineNo">327</span>                                                boolean rb = true;<a name="line.327"></a>
<span class="sourceLineNo">328</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.328"></a>
<span class="sourceLineNo">329</span>                                                        rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &gt; db.getElementDoubleAbs(it.bIndex + j);<a name="line.329"></a>
<span class="sourceLineNo">330</span>                                                }<a name="line.330"></a>
<span class="sourceLineNo">331</span>                                                r.setAbs(it.oIndex, rb);<a name="line.331"></a>
<span class="sourceLineNo">332</span>                                        }<a name="line.332"></a>
<span class="sourceLineNo">333</span>                                }<a name="line.333"></a>
<span class="sourceLineNo">334</span>                        }<a name="line.334"></a>
<span class="sourceLineNo">335</span>                } else {<a name="line.335"></a>
<span class="sourceLineNo">336</span>                        if (as &gt; bs) {<a name="line.336"></a>
<span class="sourceLineNo">337</span>                                while (it.hasNext()) {<a name="line.337"></a>
<span class="sourceLineNo">338</span>                                        final double bl = it.bLong;<a name="line.338"></a>
<span class="sourceLineNo">339</span>                                        boolean rb = true;<a name="line.339"></a>
<span class="sourceLineNo">340</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.340"></a>
<span class="sourceLineNo">341</span>                                                rb &amp;= da.getElementLongAbs(it.aIndex + j) &gt; bl;<a name="line.341"></a>
<span class="sourceLineNo">342</span>                                        }<a name="line.342"></a>
<span class="sourceLineNo">343</span>                                        r.setAbs(it.oIndex, rb);<a name="line.343"></a>
<span class="sourceLineNo">344</span>                                }<a name="line.344"></a>
<span class="sourceLineNo">345</span>                        } else if (as &lt; bs) {<a name="line.345"></a>
<span class="sourceLineNo">346</span>                                while (it.hasNext()) {<a name="line.346"></a>
<span class="sourceLineNo">347</span>                                        final double al = it.aLong;<a name="line.347"></a>
<span class="sourceLineNo">348</span>                                        boolean rb = true;<a name="line.348"></a>
<span class="sourceLineNo">349</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.349"></a>
<span class="sourceLineNo">350</span>                                                rb &amp;= al &gt; db.getElementLongAbs(it.bIndex + j);<a name="line.350"></a>
<span class="sourceLineNo">351</span>                                        }<a name="line.351"></a>
<span class="sourceLineNo">352</span>                                        r.setAbs(it.oIndex, rb);<a name="line.352"></a>
<span class="sourceLineNo">353</span>                                }<a name="line.353"></a>
<span class="sourceLineNo">354</span>                        } else {<a name="line.354"></a>
<span class="sourceLineNo">355</span>                                if (as == 1) {<a name="line.355"></a>
<span class="sourceLineNo">356</span>                                        while (it.hasNext()) {<a name="line.356"></a>
<span class="sourceLineNo">357</span>                                                r.setAbs(it.oIndex, it.aLong &gt; it.bLong);<a name="line.357"></a>
<span class="sourceLineNo">358</span>                                        }<a name="line.358"></a>
<span class="sourceLineNo">359</span>                                } else {<a name="line.359"></a>
<span class="sourceLineNo">360</span>                                        while (it.hasNext()) {<a name="line.360"></a>
<span class="sourceLineNo">361</span>                                                boolean rb = true;<a name="line.361"></a>
<span class="sourceLineNo">362</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.362"></a>
<span class="sourceLineNo">363</span>                                                        rb &amp;= da.getElementLongAbs(it.aIndex + j) &gt; db.getElementLongAbs(it.bIndex + j);<a name="line.363"></a>
<span class="sourceLineNo">364</span>                                                }<a name="line.364"></a>
<span class="sourceLineNo">365</span>                                                r.setAbs(it.oIndex, rb);<a name="line.365"></a>
<span class="sourceLineNo">366</span>                                        }<a name="line.366"></a>
<span class="sourceLineNo">367</span>                                }<a name="line.367"></a>
<span class="sourceLineNo">368</span>                        }<a name="line.368"></a>
<span class="sourceLineNo">369</span>                }<a name="line.369"></a>
<span class="sourceLineNo">370</span><a name="line.370"></a>
<span class="sourceLineNo">371</span>                return r;<a name="line.371"></a>
<span class="sourceLineNo">372</span>        }<a name="line.372"></a>
<span class="sourceLineNo">373</span><a name="line.373"></a>
<span class="sourceLineNo">374</span>        /**<a name="line.374"></a>
<span class="sourceLineNo">375</span>         * Compare item-wise for whether a's element is greater than or equal to b's<a name="line.375"></a>
<span class="sourceLineNo">376</span>         * &lt;p&gt;<a name="line.376"></a>
<span class="sourceLineNo">377</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.377"></a>
<span class="sourceLineNo">378</span>         * are greater or equal. Where the datasets have mismatched item sizes, the first element<a name="line.378"></a>
<span class="sourceLineNo">379</span>         * of the dataset with smaller items is used for comparison.<a name="line.379"></a>
<span class="sourceLineNo">380</span>         * @param a<a name="line.380"></a>
<span class="sourceLineNo">381</span>         * @param b<a name="line.381"></a>
<span class="sourceLineNo">382</span>         * @return dataset where item is true if {@code a &gt;= b}<a name="line.382"></a>
<span class="sourceLineNo">383</span>         */<a name="line.383"></a>
<span class="sourceLineNo">384</span>        public static BooleanDataset greaterThanOrEqualTo(Object a, Object b) {<a name="line.384"></a>
<span class="sourceLineNo">385</span>                return greaterThanOrEqualTo(a, b, null);<a name="line.385"></a>
<span class="sourceLineNo">386</span>        }<a name="line.386"></a>
<span class="sourceLineNo">387</span><a name="line.387"></a>
<span class="sourceLineNo">388</span>        /**<a name="line.388"></a>
<span class="sourceLineNo">389</span>         * Compare item-wise for whether a's element is greater than or equal to b's<a name="line.389"></a>
<span class="sourceLineNo">390</span>         * &lt;p&gt;<a name="line.390"></a>
<span class="sourceLineNo">391</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.391"></a>
<span class="sourceLineNo">392</span>         * are greater or equal. Where the datasets have mismatched item sizes, the first element<a name="line.392"></a>
<span class="sourceLineNo">393</span>         * of the dataset with smaller items is used for comparison.<a name="line.393"></a>
<span class="sourceLineNo">394</span>         * @param a<a name="line.394"></a>
<span class="sourceLineNo">395</span>         * @param b<a name="line.395"></a>
<span class="sourceLineNo">396</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.396"></a>
<span class="sourceLineNo">397</span>         * @return dataset where item is true if {@code a &gt;= b}<a name="line.397"></a>
<span class="sourceLineNo">398</span>         */<a name="line.398"></a>
<span class="sourceLineNo">399</span>        public static BooleanDataset greaterThanOrEqualTo(Object a, Object b, BooleanDataset o) {<a name="line.399"></a>
<span class="sourceLineNo">400</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.400"></a>
<span class="sourceLineNo">401</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.401"></a>
<span class="sourceLineNo">402</span><a name="line.402"></a>
<span class="sourceLineNo">403</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.403"></a>
<span class="sourceLineNo">404</span><a name="line.404"></a>
<span class="sourceLineNo">405</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.405"></a>
<span class="sourceLineNo">406</span><a name="line.406"></a>
<span class="sourceLineNo">407</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.407"></a>
<span class="sourceLineNo">408</span>                final int as = da.getElementsPerItem();<a name="line.408"></a>
<span class="sourceLineNo">409</span>                final int bs = db.getElementsPerItem();<a name="line.409"></a>
<span class="sourceLineNo">410</span><a name="line.410"></a>
<span class="sourceLineNo">411</span>                if (it.isOutputDouble()) {<a name="line.411"></a>
<span class="sourceLineNo">412</span>                        if (as &gt; bs) {<a name="line.412"></a>
<span class="sourceLineNo">413</span>                                while (it.hasNext()) {<a name="line.413"></a>
<span class="sourceLineNo">414</span>                                        final double bd = it.bDouble;<a name="line.414"></a>
<span class="sourceLineNo">415</span>                                        boolean rb = true;<a name="line.415"></a>
<span class="sourceLineNo">416</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.416"></a>
<span class="sourceLineNo">417</span>                                                rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &gt;= bd;<a name="line.417"></a>
<span class="sourceLineNo">418</span>                                        }<a name="line.418"></a>
<span class="sourceLineNo">419</span>                                        r.setAbs(it.oIndex, rb);<a name="line.419"></a>
<span class="sourceLineNo">420</span>                                }<a name="line.420"></a>
<span class="sourceLineNo">421</span>                        } else if (as &lt; bs) {<a name="line.421"></a>
<span class="sourceLineNo">422</span>                                while (it.hasNext()) {<a name="line.422"></a>
<span class="sourceLineNo">423</span>                                        final double ad = it.aDouble;<a name="line.423"></a>
<span class="sourceLineNo">424</span>                                        boolean rb = true;<a name="line.424"></a>
<span class="sourceLineNo">425</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.425"></a>
<span class="sourceLineNo">426</span>                                                rb &amp;= ad &gt;= db.getElementDoubleAbs(it.bIndex + j);<a name="line.426"></a>
<span class="sourceLineNo">427</span>                                        }<a name="line.427"></a>
<span class="sourceLineNo">428</span>                                        r.setAbs(it.oIndex, rb);<a name="line.428"></a>
<span class="sourceLineNo">429</span>                                }<a name="line.429"></a>
<span class="sourceLineNo">430</span>                        } else {<a name="line.430"></a>
<span class="sourceLineNo">431</span>                                if (as == 1) {<a name="line.431"></a>
<span class="sourceLineNo">432</span>                                        while (it.hasNext()) {<a name="line.432"></a>
<span class="sourceLineNo">433</span>                                                r.setAbs(it.oIndex, it.aDouble &gt;= it.bDouble);<a name="line.433"></a>
<span class="sourceLineNo">434</span>                                        }<a name="line.434"></a>
<span class="sourceLineNo">435</span>                                } else {<a name="line.435"></a>
<span class="sourceLineNo">436</span>                                        while (it.hasNext()) {<a name="line.436"></a>
<span class="sourceLineNo">437</span>                                                boolean rb = true;<a name="line.437"></a>
<span class="sourceLineNo">438</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.438"></a>
<span class="sourceLineNo">439</span>                                                        rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &gt;= db.getElementDoubleAbs(it.bIndex + j);<a name="line.439"></a>
<span class="sourceLineNo">440</span>                                                }<a name="line.440"></a>
<span class="sourceLineNo">441</span>                                                r.setAbs(it.oIndex, rb);<a name="line.441"></a>
<span class="sourceLineNo">442</span>                                        }<a name="line.442"></a>
<span class="sourceLineNo">443</span>                                }<a name="line.443"></a>
<span class="sourceLineNo">444</span>                        }<a name="line.444"></a>
<span class="sourceLineNo">445</span>                } else {<a name="line.445"></a>
<span class="sourceLineNo">446</span>                        if (as &gt; bs) {<a name="line.446"></a>
<span class="sourceLineNo">447</span>                                while (it.hasNext()) {<a name="line.447"></a>
<span class="sourceLineNo">448</span>                                        final double bl = it.bLong;<a name="line.448"></a>
<span class="sourceLineNo">449</span>                                        boolean rb = true;<a name="line.449"></a>
<span class="sourceLineNo">450</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.450"></a>
<span class="sourceLineNo">451</span>                                                rb &amp;= da.getElementLongAbs(it.aIndex + j) &gt;= bl;<a name="line.451"></a>
<span class="sourceLineNo">452</span>                                        }<a name="line.452"></a>
<span class="sourceLineNo">453</span>                                        r.setAbs(it.oIndex, rb);<a name="line.453"></a>
<span class="sourceLineNo">454</span>                                }<a name="line.454"></a>
<span class="sourceLineNo">455</span>                        } else if (as &lt; bs) {<a name="line.455"></a>
<span class="sourceLineNo">456</span>                                while (it.hasNext()) {<a name="line.456"></a>
<span class="sourceLineNo">457</span>                                        final double al = it.aLong;<a name="line.457"></a>
<span class="sourceLineNo">458</span>                                        boolean rb = true;<a name="line.458"></a>
<span class="sourceLineNo">459</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.459"></a>
<span class="sourceLineNo">460</span>                                                rb &amp;= al &gt;= db.getElementLongAbs(it.bIndex + j);<a name="line.460"></a>
<span class="sourceLineNo">461</span>                                        }<a name="line.461"></a>
<span class="sourceLineNo">462</span>                                        r.setAbs(it.oIndex, rb);<a name="line.462"></a>
<span class="sourceLineNo">463</span>                                }<a name="line.463"></a>
<span class="sourceLineNo">464</span>                        } else {<a name="line.464"></a>
<span class="sourceLineNo">465</span>                                if (as == 1) {<a name="line.465"></a>
<span class="sourceLineNo">466</span>                                        while (it.hasNext()) {<a name="line.466"></a>
<span class="sourceLineNo">467</span>                                                r.setAbs(it.oIndex, it.aLong &gt;= it.bLong);<a name="line.467"></a>
<span class="sourceLineNo">468</span>                                        }<a name="line.468"></a>
<span class="sourceLineNo">469</span>                                } else {<a name="line.469"></a>
<span class="sourceLineNo">470</span>                                        while (it.hasNext()) {<a name="line.470"></a>
<span class="sourceLineNo">471</span>                                                boolean rb = true;<a name="line.471"></a>
<span class="sourceLineNo">472</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.472"></a>
<span class="sourceLineNo">473</span>                                                        rb &amp;= da.getElementLongAbs(it.aIndex + j) &gt;= db.getElementLongAbs(it.bIndex + j);<a name="line.473"></a>
<span class="sourceLineNo">474</span>                                                }<a name="line.474"></a>
<span class="sourceLineNo">475</span>                                                r.setAbs(it.oIndex, rb);<a name="line.475"></a>
<span class="sourceLineNo">476</span>                                        }<a name="line.476"></a>
<span class="sourceLineNo">477</span>                                }<a name="line.477"></a>
<span class="sourceLineNo">478</span>                        }<a name="line.478"></a>
<span class="sourceLineNo">479</span>                }<a name="line.479"></a>
<span class="sourceLineNo">480</span><a name="line.480"></a>
<span class="sourceLineNo">481</span>                return r;<a name="line.481"></a>
<span class="sourceLineNo">482</span>        }<a name="line.482"></a>
<span class="sourceLineNo">483</span><a name="line.483"></a>
<span class="sourceLineNo">484</span>        /**<a name="line.484"></a>
<span class="sourceLineNo">485</span>         * Compare item-wise for whether a's element is less than b's<a name="line.485"></a>
<span class="sourceLineNo">486</span>         * &lt;p&gt;<a name="line.486"></a>
<span class="sourceLineNo">487</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.487"></a>
<span class="sourceLineNo">488</span>         * are lesser. Where the datasets have mismatched item sizes, the first element<a name="line.488"></a>
<span class="sourceLineNo">489</span>         * of the dataset with smaller items is used for comparison.<a name="line.489"></a>
<span class="sourceLineNo">490</span>         * @param a<a name="line.490"></a>
<span class="sourceLineNo">491</span>         * @param b<a name="line.491"></a>
<span class="sourceLineNo">492</span>         * @return dataset where item is true if {@code a &lt; b}<a name="line.492"></a>
<span class="sourceLineNo">493</span>         */<a name="line.493"></a>
<span class="sourceLineNo">494</span>        public static BooleanDataset lessThan(Object a, Object b) {<a name="line.494"></a>
<span class="sourceLineNo">495</span>                return lessThan(a, b, null);<a name="line.495"></a>
<span class="sourceLineNo">496</span>        }<a name="line.496"></a>
<span class="sourceLineNo">497</span><a name="line.497"></a>
<span class="sourceLineNo">498</span>        /**<a name="line.498"></a>
<span class="sourceLineNo">499</span>         * Compare item-wise for whether a's element is less than b's<a name="line.499"></a>
<span class="sourceLineNo">500</span>         * &lt;p&gt;<a name="line.500"></a>
<span class="sourceLineNo">501</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.501"></a>
<span class="sourceLineNo">502</span>         * are lesser. Where the datasets have mismatched item sizes, the first element<a name="line.502"></a>
<span class="sourceLineNo">503</span>         * of the dataset with smaller items is used for comparison.<a name="line.503"></a>
<span class="sourceLineNo">504</span>         * @param a<a name="line.504"></a>
<span class="sourceLineNo">505</span>         * @param b<a name="line.505"></a>
<span class="sourceLineNo">506</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.506"></a>
<span class="sourceLineNo">507</span>         * @return dataset where item is true if {@code a &lt; b}<a name="line.507"></a>
<span class="sourceLineNo">508</span>         */<a name="line.508"></a>
<span class="sourceLineNo">509</span>        public static BooleanDataset lessThan(Object a, Object b, BooleanDataset o) {<a name="line.509"></a>
<span class="sourceLineNo">510</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.510"></a>
<span class="sourceLineNo">511</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.511"></a>
<span class="sourceLineNo">512</span><a name="line.512"></a>
<span class="sourceLineNo">513</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.513"></a>
<span class="sourceLineNo">514</span><a name="line.514"></a>
<span class="sourceLineNo">515</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.515"></a>
<span class="sourceLineNo">516</span><a name="line.516"></a>
<span class="sourceLineNo">517</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.517"></a>
<span class="sourceLineNo">518</span>                it.setOutputDouble(true);<a name="line.518"></a>
<span class="sourceLineNo">519</span>                final int as = da.getElementsPerItem();<a name="line.519"></a>
<span class="sourceLineNo">520</span>                final int bs = db.getElementsPerItem();<a name="line.520"></a>
<span class="sourceLineNo">521</span><a name="line.521"></a>
<span class="sourceLineNo">522</span>                if (it.isOutputDouble()) {<a name="line.522"></a>
<span class="sourceLineNo">523</span>                        if (as &gt; bs) {<a name="line.523"></a>
<span class="sourceLineNo">524</span>                                while (it.hasNext()) {<a name="line.524"></a>
<span class="sourceLineNo">525</span>                                        final double bd = it.bDouble;<a name="line.525"></a>
<span class="sourceLineNo">526</span>                                        boolean rb = true;<a name="line.526"></a>
<span class="sourceLineNo">527</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.527"></a>
<span class="sourceLineNo">528</span>                                                rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &lt; bd;<a name="line.528"></a>
<span class="sourceLineNo">529</span>                                        }<a name="line.529"></a>
<span class="sourceLineNo">530</span>                                        r.setAbs(it.oIndex, rb);<a name="line.530"></a>
<span class="sourceLineNo">531</span>                                }<a name="line.531"></a>
<span class="sourceLineNo">532</span>                        } else if (as &lt; bs) {<a name="line.532"></a>
<span class="sourceLineNo">533</span>                                while (it.hasNext()) {<a name="line.533"></a>
<span class="sourceLineNo">534</span>                                        final double ad = it.aDouble;<a name="line.534"></a>
<span class="sourceLineNo">535</span>                                        boolean rb = true;<a name="line.535"></a>
<span class="sourceLineNo">536</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.536"></a>
<span class="sourceLineNo">537</span>                                                rb &amp;= ad &lt; db.getElementDoubleAbs(it.bIndex + j);<a name="line.537"></a>
<span class="sourceLineNo">538</span>                                        }<a name="line.538"></a>
<span class="sourceLineNo">539</span>                                        r.setAbs(it.oIndex, rb);<a name="line.539"></a>
<span class="sourceLineNo">540</span>                                }<a name="line.540"></a>
<span class="sourceLineNo">541</span>                        } else {<a name="line.541"></a>
<span class="sourceLineNo">542</span>                                if (as == 1) {<a name="line.542"></a>
<span class="sourceLineNo">543</span>                                        while (it.hasNext()) {<a name="line.543"></a>
<span class="sourceLineNo">544</span>                                                r.setAbs(it.oIndex, it.aDouble &lt; it.bDouble);<a name="line.544"></a>
<span class="sourceLineNo">545</span>                                        }<a name="line.545"></a>
<span class="sourceLineNo">546</span>                                } else {<a name="line.546"></a>
<span class="sourceLineNo">547</span>                                        while (it.hasNext()) {<a name="line.547"></a>
<span class="sourceLineNo">548</span>                                                boolean rb = true;<a name="line.548"></a>
<span class="sourceLineNo">549</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.549"></a>
<span class="sourceLineNo">550</span>                                                        rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &lt; db.getElementDoubleAbs(it.bIndex + j);<a name="line.550"></a>
<span class="sourceLineNo">551</span>                                                }<a name="line.551"></a>
<span class="sourceLineNo">552</span>                                                r.setAbs(it.oIndex, rb);<a name="line.552"></a>
<span class="sourceLineNo">553</span>                                        }<a name="line.553"></a>
<span class="sourceLineNo">554</span>                                }<a name="line.554"></a>
<span class="sourceLineNo">555</span>                        }<a name="line.555"></a>
<span class="sourceLineNo">556</span>                } else {<a name="line.556"></a>
<span class="sourceLineNo">557</span>                        if (as &gt; bs) {<a name="line.557"></a>
<span class="sourceLineNo">558</span>                                while (it.hasNext()) {<a name="line.558"></a>
<span class="sourceLineNo">559</span>                                        final double bl = it.bLong;<a name="line.559"></a>
<span class="sourceLineNo">560</span>                                        boolean rb = true;<a name="line.560"></a>
<span class="sourceLineNo">561</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.561"></a>
<span class="sourceLineNo">562</span>                                                rb &amp;= da.getElementLongAbs(it.aIndex + j) &lt; bl;<a name="line.562"></a>
<span class="sourceLineNo">563</span>                                        }<a name="line.563"></a>
<span class="sourceLineNo">564</span>                                        r.setAbs(it.oIndex, rb);<a name="line.564"></a>
<span class="sourceLineNo">565</span>                                }<a name="line.565"></a>
<span class="sourceLineNo">566</span>                        } else if (as &lt; bs) {<a name="line.566"></a>
<span class="sourceLineNo">567</span>                                while (it.hasNext()) {<a name="line.567"></a>
<span class="sourceLineNo">568</span>                                        final double al = it.aLong;<a name="line.568"></a>
<span class="sourceLineNo">569</span>                                        boolean rb = true;<a name="line.569"></a>
<span class="sourceLineNo">570</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.570"></a>
<span class="sourceLineNo">571</span>                                                rb &amp;= al &lt; db.getElementLongAbs(it.bIndex + j);<a name="line.571"></a>
<span class="sourceLineNo">572</span>                                        }<a name="line.572"></a>
<span class="sourceLineNo">573</span>                                        r.setAbs(it.oIndex, rb);<a name="line.573"></a>
<span class="sourceLineNo">574</span>                                }<a name="line.574"></a>
<span class="sourceLineNo">575</span>                        } else {<a name="line.575"></a>
<span class="sourceLineNo">576</span>                                if (as == 1) {<a name="line.576"></a>
<span class="sourceLineNo">577</span>                                        while (it.hasNext()) {<a name="line.577"></a>
<span class="sourceLineNo">578</span>                                                r.setAbs(it.oIndex, it.aLong &lt; it.bLong);<a name="line.578"></a>
<span class="sourceLineNo">579</span>                                        }<a name="line.579"></a>
<span class="sourceLineNo">580</span>                                } else {<a name="line.580"></a>
<span class="sourceLineNo">581</span>                                        while (it.hasNext()) {<a name="line.581"></a>
<span class="sourceLineNo">582</span>                                                boolean rb = true;<a name="line.582"></a>
<span class="sourceLineNo">583</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.583"></a>
<span class="sourceLineNo">584</span>                                                        rb &amp;= da.getElementLongAbs(it.aIndex + j) &lt; db.getElementLongAbs(it.bIndex + j);<a name="line.584"></a>
<span class="sourceLineNo">585</span>                                                }<a name="line.585"></a>
<span class="sourceLineNo">586</span>                                                r.setAbs(it.oIndex, rb);<a name="line.586"></a>
<span class="sourceLineNo">587</span>                                        }<a name="line.587"></a>
<span class="sourceLineNo">588</span>                                }<a name="line.588"></a>
<span class="sourceLineNo">589</span>                        }<a name="line.589"></a>
<span class="sourceLineNo">590</span>                }<a name="line.590"></a>
<span class="sourceLineNo">591</span><a name="line.591"></a>
<span class="sourceLineNo">592</span>                return r;<a name="line.592"></a>
<span class="sourceLineNo">593</span>        }<a name="line.593"></a>
<span class="sourceLineNo">594</span><a name="line.594"></a>
<span class="sourceLineNo">595</span>        /**<a name="line.595"></a>
<span class="sourceLineNo">596</span>         * Compare item-wise for whether a's element is less than or equal to b's<a name="line.596"></a>
<span class="sourceLineNo">597</span>         * &lt;p&gt;<a name="line.597"></a>
<span class="sourceLineNo">598</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.598"></a>
<span class="sourceLineNo">599</span>         * are lesser or equal. Where the datasets have mismatched item sizes, the first element<a name="line.599"></a>
<span class="sourceLineNo">600</span>         * of the dataset with smaller items is used for comparison.<a name="line.600"></a>
<span class="sourceLineNo">601</span>         * @param a<a name="line.601"></a>
<span class="sourceLineNo">602</span>         * @param b<a name="line.602"></a>
<span class="sourceLineNo">603</span>         * @return dataset where item is true if {@code a &lt;= b}<a name="line.603"></a>
<span class="sourceLineNo">604</span>         */<a name="line.604"></a>
<span class="sourceLineNo">605</span>        public static BooleanDataset lessThanOrEqualTo(Object a, Object b) {<a name="line.605"></a>
<span class="sourceLineNo">606</span>                return lessThanOrEqualTo(a, b, null);<a name="line.606"></a>
<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
<span class="sourceLineNo">608</span><a name="line.608"></a>
<span class="sourceLineNo">609</span>        /**<a name="line.609"></a>
<span class="sourceLineNo">610</span>         * Compare item-wise for whether a's element is less than or equal to b's<a name="line.610"></a>
<span class="sourceLineNo">611</span>         * &lt;p&gt;<a name="line.611"></a>
<span class="sourceLineNo">612</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.612"></a>
<span class="sourceLineNo">613</span>         * are lesser or equal. Where the datasets have mismatched item sizes, the first element<a name="line.613"></a>
<span class="sourceLineNo">614</span>         * of the dataset with smaller items is used for comparison.<a name="line.614"></a>
<span class="sourceLineNo">615</span>         * @param a<a name="line.615"></a>
<span class="sourceLineNo">616</span>         * @param b<a name="line.616"></a>
<span class="sourceLineNo">617</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.617"></a>
<span class="sourceLineNo">618</span>         * @return dataset where item is true if {@code a &lt;= b}<a name="line.618"></a>
<span class="sourceLineNo">619</span>         */<a name="line.619"></a>
<span class="sourceLineNo">620</span>        public static BooleanDataset lessThanOrEqualTo(Object a, Object b, BooleanDataset o) {<a name="line.620"></a>
<span class="sourceLineNo">621</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.621"></a>
<span class="sourceLineNo">622</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.622"></a>
<span class="sourceLineNo">623</span><a name="line.623"></a>
<span class="sourceLineNo">624</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.624"></a>
<span class="sourceLineNo">625</span><a name="line.625"></a>
<span class="sourceLineNo">626</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.626"></a>
<span class="sourceLineNo">627</span><a name="line.627"></a>
<span class="sourceLineNo">628</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.628"></a>
<span class="sourceLineNo">629</span>                it.setOutputDouble(true);<a name="line.629"></a>
<span class="sourceLineNo">630</span>                final int as = da.getElementsPerItem();<a name="line.630"></a>
<span class="sourceLineNo">631</span>                final int bs = db.getElementsPerItem();<a name="line.631"></a>
<span class="sourceLineNo">632</span><a name="line.632"></a>
<span class="sourceLineNo">633</span>                if (it.isOutputDouble()) {<a name="line.633"></a>
<span class="sourceLineNo">634</span>                        if (as &gt; bs) {<a name="line.634"></a>
<span class="sourceLineNo">635</span>                                while (it.hasNext()) {<a name="line.635"></a>
<span class="sourceLineNo">636</span>                                        final double bd = it.bDouble;<a name="line.636"></a>
<span class="sourceLineNo">637</span>                                        boolean rb = true;<a name="line.637"></a>
<span class="sourceLineNo">638</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.638"></a>
<span class="sourceLineNo">639</span>                                                rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &lt;= bd;<a name="line.639"></a>
<span class="sourceLineNo">640</span>                                        }<a name="line.640"></a>
<span class="sourceLineNo">641</span>                                        r.setAbs(it.oIndex, rb);<a name="line.641"></a>
<span class="sourceLineNo">642</span>                                }<a name="line.642"></a>
<span class="sourceLineNo">643</span>                        } else if (as &lt; bs) {<a name="line.643"></a>
<span class="sourceLineNo">644</span>                                while (it.hasNext()) {<a name="line.644"></a>
<span class="sourceLineNo">645</span>                                        final double ad = it.aDouble;<a name="line.645"></a>
<span class="sourceLineNo">646</span>                                        boolean rb = true;<a name="line.646"></a>
<span class="sourceLineNo">647</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.647"></a>
<span class="sourceLineNo">648</span>                                                rb &amp;= ad &lt;= db.getElementDoubleAbs(it.bIndex + j);<a name="line.648"></a>
<span class="sourceLineNo">649</span>                                        }<a name="line.649"></a>
<span class="sourceLineNo">650</span>                                        r.setAbs(it.oIndex, rb);<a name="line.650"></a>
<span class="sourceLineNo">651</span>                                }<a name="line.651"></a>
<span class="sourceLineNo">652</span>                        } else {<a name="line.652"></a>
<span class="sourceLineNo">653</span>                                if (as == 1) {<a name="line.653"></a>
<span class="sourceLineNo">654</span>                                        while (it.hasNext()) {<a name="line.654"></a>
<span class="sourceLineNo">655</span>                                                r.setAbs(it.oIndex, it.aDouble &lt;= it.bDouble);<a name="line.655"></a>
<span class="sourceLineNo">656</span>                                        }<a name="line.656"></a>
<span class="sourceLineNo">657</span>                                } else {<a name="line.657"></a>
<span class="sourceLineNo">658</span>                                        while (it.hasNext()) {<a name="line.658"></a>
<span class="sourceLineNo">659</span>                                                boolean rb = true;<a name="line.659"></a>
<span class="sourceLineNo">660</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.660"></a>
<span class="sourceLineNo">661</span>                                                        rb &amp;= da.getElementDoubleAbs(it.aIndex + j) &lt;= db.getElementDoubleAbs(it.bIndex + j);<a name="line.661"></a>
<span class="sourceLineNo">662</span>                                                }<a name="line.662"></a>
<span class="sourceLineNo">663</span>                                                r.setAbs(it.oIndex, rb);<a name="line.663"></a>
<span class="sourceLineNo">664</span>                                        }<a name="line.664"></a>
<span class="sourceLineNo">665</span>                                }<a name="line.665"></a>
<span class="sourceLineNo">666</span>                        }<a name="line.666"></a>
<span class="sourceLineNo">667</span>                } else {<a name="line.667"></a>
<span class="sourceLineNo">668</span>                        if (as &gt; bs) {<a name="line.668"></a>
<span class="sourceLineNo">669</span>                                while (it.hasNext()) {<a name="line.669"></a>
<span class="sourceLineNo">670</span>                                        final double bl = it.bLong;<a name="line.670"></a>
<span class="sourceLineNo">671</span>                                        boolean rb = true;<a name="line.671"></a>
<span class="sourceLineNo">672</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.672"></a>
<span class="sourceLineNo">673</span>                                                rb &amp;= da.getElementLongAbs(it.aIndex + j) &lt;= bl;<a name="line.673"></a>
<span class="sourceLineNo">674</span>                                        }<a name="line.674"></a>
<span class="sourceLineNo">675</span>                                        r.setAbs(it.oIndex, rb);<a name="line.675"></a>
<span class="sourceLineNo">676</span>                                }<a name="line.676"></a>
<span class="sourceLineNo">677</span>                        } else if (as &lt; bs) {<a name="line.677"></a>
<span class="sourceLineNo">678</span>                                while (it.hasNext()) {<a name="line.678"></a>
<span class="sourceLineNo">679</span>                                        final double al = it.aLong;<a name="line.679"></a>
<span class="sourceLineNo">680</span>                                        boolean rb = true;<a name="line.680"></a>
<span class="sourceLineNo">681</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.681"></a>
<span class="sourceLineNo">682</span>                                                rb &amp;= al &lt;= db.getElementLongAbs(it.bIndex + j);<a name="line.682"></a>
<span class="sourceLineNo">683</span>                                        }<a name="line.683"></a>
<span class="sourceLineNo">684</span>                                        r.setAbs(it.oIndex, rb);<a name="line.684"></a>
<span class="sourceLineNo">685</span>                                }<a name="line.685"></a>
<span class="sourceLineNo">686</span>                        } else {<a name="line.686"></a>
<span class="sourceLineNo">687</span>                                if (as == 1) {<a name="line.687"></a>
<span class="sourceLineNo">688</span>                                        while (it.hasNext()) {<a name="line.688"></a>
<span class="sourceLineNo">689</span>                                                r.setAbs(it.oIndex, it.aLong &lt;= it.bLong);<a name="line.689"></a>
<span class="sourceLineNo">690</span>                                        }<a name="line.690"></a>
<span class="sourceLineNo">691</span>                                } else {<a name="line.691"></a>
<span class="sourceLineNo">692</span>                                        while (it.hasNext()) {<a name="line.692"></a>
<span class="sourceLineNo">693</span>                                                boolean rb = true;<a name="line.693"></a>
<span class="sourceLineNo">694</span>                                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.694"></a>
<span class="sourceLineNo">695</span>                                                        rb &amp;= da.getElementLongAbs(it.aIndex + j) &lt;= db.getElementLongAbs(it.bIndex + j);<a name="line.695"></a>
<span class="sourceLineNo">696</span>                                                }<a name="line.696"></a>
<span class="sourceLineNo">697</span>                                                r.setAbs(it.oIndex, rb);<a name="line.697"></a>
<span class="sourceLineNo">698</span>                                        }<a name="line.698"></a>
<span class="sourceLineNo">699</span>                                }<a name="line.699"></a>
<span class="sourceLineNo">700</span>                        }<a name="line.700"></a>
<span class="sourceLineNo">701</span>                }<a name="line.701"></a>
<span class="sourceLineNo">702</span><a name="line.702"></a>
<span class="sourceLineNo">703</span>                return r;<a name="line.703"></a>
<span class="sourceLineNo">704</span>        }<a name="line.704"></a>
<span class="sourceLineNo">705</span><a name="line.705"></a>
<span class="sourceLineNo">706</span>        /**<a name="line.706"></a>
<span class="sourceLineNo">707</span>         * @param a<a name="line.707"></a>
<span class="sourceLineNo">708</span>         * @param lo lower bound<a name="line.708"></a>
<span class="sourceLineNo">709</span>         * @param hi upper bound<a name="line.709"></a>
<span class="sourceLineNo">710</span>         * @return dataset where item is true if {@code l &lt;= a &lt;= h}<a name="line.710"></a>
<span class="sourceLineNo">711</span>         */<a name="line.711"></a>
<span class="sourceLineNo">712</span>        public static BooleanDataset withinRange(Object a, Number lo, Number hi) {<a name="line.712"></a>
<span class="sourceLineNo">713</span>                return withinRange(a, null, lo, hi);<a name="line.713"></a>
<span class="sourceLineNo">714</span>        }<a name="line.714"></a>
<span class="sourceLineNo">715</span><a name="line.715"></a>
<span class="sourceLineNo">716</span>        /**<a name="line.716"></a>
<span class="sourceLineNo">717</span>         * @param a<a name="line.717"></a>
<span class="sourceLineNo">718</span>         * @param lo lower bound<a name="line.718"></a>
<span class="sourceLineNo">719</span>         * @param hi upper bound<a name="line.719"></a>
<span class="sourceLineNo">720</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.720"></a>
<span class="sourceLineNo">721</span>         * @return dataset where item is true if {@code l &lt;= a &lt;= h}<a name="line.721"></a>
<span class="sourceLineNo">722</span>         */<a name="line.722"></a>
<span class="sourceLineNo">723</span>        public static BooleanDataset withinRange(Object a, BooleanDataset o, Number lo, Number hi) {<a name="line.723"></a>
<span class="sourceLineNo">724</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.724"></a>
<span class="sourceLineNo">725</span><a name="line.725"></a>
<span class="sourceLineNo">726</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.726"></a>
<span class="sourceLineNo">727</span><a name="line.727"></a>
<span class="sourceLineNo">728</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.728"></a>
<span class="sourceLineNo">729</span><a name="line.729"></a>
<span class="sourceLineNo">730</span>                final SingleInputBroadcastIterator it = new SingleInputBroadcastIterator(da, r);<a name="line.730"></a>
<span class="sourceLineNo">731</span>                final int as = da.getElementsPerItem();<a name="line.731"></a>
<span class="sourceLineNo">732</span><a name="line.732"></a>
<span class="sourceLineNo">733</span>                if (it.isOutputDouble()) {<a name="line.733"></a>
<span class="sourceLineNo">734</span>                        final double l = lo.doubleValue();<a name="line.734"></a>
<span class="sourceLineNo">735</span>                        final double h = hi.doubleValue();<a name="line.735"></a>
<span class="sourceLineNo">736</span>                        if (as == 1) {<a name="line.736"></a>
<span class="sourceLineNo">737</span>                                while (it.hasNext()) {<a name="line.737"></a>
<span class="sourceLineNo">738</span>                                        final double ad = it.aDouble;<a name="line.738"></a>
<span class="sourceLineNo">739</span>                                        r.setAbs(it.oIndex, ad &gt;= l &amp;&amp; ad &lt;= h);<a name="line.739"></a>
<span class="sourceLineNo">740</span>                                }<a name="line.740"></a>
<span class="sourceLineNo">741</span>                        } else {<a name="line.741"></a>
<span class="sourceLineNo">742</span>                                while (it.hasNext()) {<a name="line.742"></a>
<span class="sourceLineNo">743</span>                                        boolean rb = true;<a name="line.743"></a>
<span class="sourceLineNo">744</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.744"></a>
<span class="sourceLineNo">745</span>                                                final double ad = da.getElementDoubleAbs(it.aIndex);<a name="line.745"></a>
<span class="sourceLineNo">746</span>                                                rb &amp;= ad &gt;= l &amp;&amp; ad &lt;= h;<a name="line.746"></a>
<span class="sourceLineNo">747</span>                                        }<a name="line.747"></a>
<span class="sourceLineNo">748</span>                                        r.setAbs(it.oIndex, rb);<a name="line.748"></a>
<span class="sourceLineNo">749</span>                                }<a name="line.749"></a>
<span class="sourceLineNo">750</span>                        }<a name="line.750"></a>
<span class="sourceLineNo">751</span>                } else {<a name="line.751"></a>
<span class="sourceLineNo">752</span>                        final long l = lo.longValue();<a name="line.752"></a>
<span class="sourceLineNo">753</span>                        final long h = hi.longValue();<a name="line.753"></a>
<span class="sourceLineNo">754</span>                        if (as == 1) {<a name="line.754"></a>
<span class="sourceLineNo">755</span>                                while (it.hasNext()) {<a name="line.755"></a>
<span class="sourceLineNo">756</span>                                        final long al = it.aLong;<a name="line.756"></a>
<span class="sourceLineNo">757</span>                                        r.setAbs(it.oIndex, al &gt;= l &amp;&amp; al &lt;= h);<a name="line.757"></a>
<span class="sourceLineNo">758</span>                                }<a name="line.758"></a>
<span class="sourceLineNo">759</span>                        } else {<a name="line.759"></a>
<span class="sourceLineNo">760</span>                                while (it.hasNext()) {<a name="line.760"></a>
<span class="sourceLineNo">761</span>                                        boolean rb = true;<a name="line.761"></a>
<span class="sourceLineNo">762</span>                                        for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.762"></a>
<span class="sourceLineNo">763</span>                                                final long al = da.getElementLongAbs(it.aIndex);<a name="line.763"></a>
<span class="sourceLineNo">764</span>                                                rb &amp;= al &gt;= l &amp;&amp; al &lt;= h;<a name="line.764"></a>
<span class="sourceLineNo">765</span>                                        }<a name="line.765"></a>
<span class="sourceLineNo">766</span>                                        r.setAbs(it.oIndex, rb);<a name="line.766"></a>
<span class="sourceLineNo">767</span>                                }<a name="line.767"></a>
<span class="sourceLineNo">768</span>                        }<a name="line.768"></a>
<span class="sourceLineNo">769</span>                }<a name="line.769"></a>
<span class="sourceLineNo">770</span><a name="line.770"></a>
<span class="sourceLineNo">771</span>                return r;<a name="line.771"></a>
<span class="sourceLineNo">772</span>        }<a name="line.772"></a>
<span class="sourceLineNo">773</span><a name="line.773"></a>
<span class="sourceLineNo">774</span>        /**<a name="line.774"></a>
<span class="sourceLineNo">775</span>         * Compare item-wise for whether a's element is almost equal to b's<a name="line.775"></a>
<span class="sourceLineNo">776</span>         * &lt;p&gt;<a name="line.776"></a>
<span class="sourceLineNo">777</span>         * For multi-element items, comparison is true if all elements in an item<a name="line.777"></a>
<span class="sourceLineNo">778</span>         * are equal up to a tolerance. Where the datasets have mismatched item sizes, the first element<a name="line.778"></a>
<span class="sourceLineNo">779</span>         * of the dataset with smaller items is used for comparison.<a name="line.779"></a>
<span class="sourceLineNo">780</span>         * @param a<a name="line.780"></a>
<span class="sourceLineNo">781</span>         * @param b<a name="line.781"></a>
<span class="sourceLineNo">782</span>         * @param relTolerance<a name="line.782"></a>
<span class="sourceLineNo">783</span>         * @param absTolerance<a name="line.783"></a>
<span class="sourceLineNo">784</span>         * @return true if all items satisfy {@code abs(a - b) &lt;= absTol + relTol*max(abs(a),abs(b))}<a name="line.784"></a>
<span class="sourceLineNo">785</span>         */<a name="line.785"></a>
<span class="sourceLineNo">786</span>        public static boolean allCloseTo(Object a, Object b, double relTolerance, double absTolerance) {<a name="line.786"></a>
<span class="sourceLineNo">787</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.787"></a>
<span class="sourceLineNo">788</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.788"></a>
<span class="sourceLineNo">789</span><a name="line.789"></a>
<span class="sourceLineNo">790</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db);<a name="line.790"></a>
<span class="sourceLineNo">791</span>                it.setOutputDouble(true);<a name="line.791"></a>
<span class="sourceLineNo">792</span>                final int as = da.getElementsPerItem();<a name="line.792"></a>
<span class="sourceLineNo">793</span>                final int bs = db.getElementsPerItem();<a name="line.793"></a>
<span class="sourceLineNo">794</span><a name="line.794"></a>
<span class="sourceLineNo">795</span>                if (as &gt; bs) {<a name="line.795"></a>
<span class="sourceLineNo">796</span>                        if (da.isComplex()) {<a name="line.796"></a>
<span class="sourceLineNo">797</span>                                while (it.hasNext()) {<a name="line.797"></a>
<span class="sourceLineNo">798</span>                                        if (!isCloseNP(it.aDouble, it.bDouble, relTolerance, absTolerance))<a name="line.798"></a>
<span class="sourceLineNo">799</span>                                                return false;<a name="line.799"></a>
<span class="sourceLineNo">800</span>                                        if (!isCloseNP(da.getElementDoubleAbs(it.aIndex + 1), relTolerance, absTolerance))<a name="line.800"></a>
<span class="sourceLineNo">801</span>                                                return false;<a name="line.801"></a>
<span class="sourceLineNo">802</span>                                }<a name="line.802"></a>
<span class="sourceLineNo">803</span>                        } else {<a name="line.803"></a>
<span class="sourceLineNo">804</span>                                while (it.hasNext()) {<a name="line.804"></a>
<span class="sourceLineNo">805</span>                                        final double bd = it.bDouble;<a name="line.805"></a>
<span class="sourceLineNo">806</span>                                        for (int j = 0; j &lt; as; j++) {<a name="line.806"></a>
<span class="sourceLineNo">807</span>                                                if (!isCloseNP(da.getElementDoubleAbs(it.aIndex + j), bd, relTolerance, absTolerance))<a name="line.807"></a>
<span class="sourceLineNo">808</span>                                                        return false;<a name="line.808"></a>
<span class="sourceLineNo">809</span>                                        }<a name="line.809"></a>
<span class="sourceLineNo">810</span>                                }<a name="line.810"></a>
<span class="sourceLineNo">811</span>                        }<a name="line.811"></a>
<span class="sourceLineNo">812</span>                } else if (as &lt; bs) {<a name="line.812"></a>
<span class="sourceLineNo">813</span>                        if (db.isComplex()) {<a name="line.813"></a>
<span class="sourceLineNo">814</span>                                while (it.hasNext()) {<a name="line.814"></a>
<span class="sourceLineNo">815</span>                                        if (!isCloseNP(it.aDouble, it.bDouble, relTolerance, absTolerance))<a name="line.815"></a>
<span class="sourceLineNo">816</span>                                                return false;<a name="line.816"></a>
<span class="sourceLineNo">817</span>                                        if (!isCloseNP(db.getElementDoubleAbs(it.bIndex + 1), relTolerance, absTolerance))<a name="line.817"></a>
<span class="sourceLineNo">818</span>                                                return false;<a name="line.818"></a>
<span class="sourceLineNo">819</span>                                }<a name="line.819"></a>
<span class="sourceLineNo">820</span>                        } else {<a name="line.820"></a>
<span class="sourceLineNo">821</span>                                while (it.hasNext()) {<a name="line.821"></a>
<span class="sourceLineNo">822</span>                                        final double ad = it.aDouble;<a name="line.822"></a>
<span class="sourceLineNo">823</span>                                        for (int j = 0; j &lt; bs; j++) {<a name="line.823"></a>
<span class="sourceLineNo">824</span>                                                if (!isCloseNP(ad, db.getElementDoubleAbs(it.bIndex + j), relTolerance, absTolerance))<a name="line.824"></a>
<span class="sourceLineNo">825</span>                                                        return false;<a name="line.825"></a>
<span class="sourceLineNo">826</span>                                        }<a name="line.826"></a>
<span class="sourceLineNo">827</span>                                }<a name="line.827"></a>
<span class="sourceLineNo">828</span>                        }<a name="line.828"></a>
<span class="sourceLineNo">829</span>                } else {<a name="line.829"></a>
<span class="sourceLineNo">830</span>                        if (as == 1) {<a name="line.830"></a>
<span class="sourceLineNo">831</span>                                while (it.hasNext()) {<a name="line.831"></a>
<span class="sourceLineNo">832</span>                                        if (!isCloseNP(it.aDouble, it.bDouble, relTolerance, absTolerance))<a name="line.832"></a>
<span class="sourceLineNo">833</span>                                                return false;<a name="line.833"></a>
<span class="sourceLineNo">834</span>                                }<a name="line.834"></a>
<span class="sourceLineNo">835</span>                        } else {<a name="line.835"></a>
<span class="sourceLineNo">836</span>                                while (it.hasNext()) {<a name="line.836"></a>
<span class="sourceLineNo">837</span>                                        for (int j = 0; j &lt; bs; j++) {<a name="line.837"></a>
<span class="sourceLineNo">838</span>                                                if (!isCloseNP(da.getElementDoubleAbs(it.aIndex + j), db.getElementDoubleAbs(it.bIndex + j), relTolerance, absTolerance))<a name="line.838"></a>
<span class="sourceLineNo">839</span>                                                        return false;<a name="line.839"></a>
<span class="sourceLineNo">840</span>                                        }<a name="line.840"></a>
<span class="sourceLineNo">841</span>                                }<a name="line.841"></a>
<span class="sourceLineNo">842</span>                        }<a name="line.842"></a>
<span class="sourceLineNo">843</span>                }<a name="line.843"></a>
<span class="sourceLineNo">844</span>                <a name="line.844"></a>
<span class="sourceLineNo">845</span>                return true;<a name="line.845"></a>
<span class="sourceLineNo">846</span>        }<a name="line.846"></a>
<span class="sourceLineNo">847</span><a name="line.847"></a>
<span class="sourceLineNo">848</span>        /**<a name="line.848"></a>
<span class="sourceLineNo">849</span>         * @param a<a name="line.849"></a>
<span class="sourceLineNo">850</span>         * @return true if all elements are true<a name="line.850"></a>
<span class="sourceLineNo">851</span>         */<a name="line.851"></a>
<span class="sourceLineNo">852</span>        public static boolean allTrue(Object a) {<a name="line.852"></a>
<span class="sourceLineNo">853</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.853"></a>
<span class="sourceLineNo">854</span>                final IndexIterator it = da.getIterator();<a name="line.854"></a>
<span class="sourceLineNo">855</span>                final int as = da.getElementsPerItem();<a name="line.855"></a>
<span class="sourceLineNo">856</span><a name="line.856"></a>
<span class="sourceLineNo">857</span>                if (as == 1) {<a name="line.857"></a>
<span class="sourceLineNo">858</span>                        while (it.hasNext()) {<a name="line.858"></a>
<span class="sourceLineNo">859</span>                                if (!da.getElementBooleanAbs(it.index))<a name="line.859"></a>
<span class="sourceLineNo">860</span>                                        return false;<a name="line.860"></a>
<span class="sourceLineNo">861</span>                        }<a name="line.861"></a>
<span class="sourceLineNo">862</span>                } else {<a name="line.862"></a>
<span class="sourceLineNo">863</span>                        while (it.hasNext()) {<a name="line.863"></a>
<span class="sourceLineNo">864</span>                                for (int j = 0; j &lt; as; j++) {<a name="line.864"></a>
<span class="sourceLineNo">865</span>                                        if (!da.getElementBooleanAbs(it.index + j))<a name="line.865"></a>
<span class="sourceLineNo">866</span>                                                return false;<a name="line.866"></a>
<span class="sourceLineNo">867</span>                                }<a name="line.867"></a>
<span class="sourceLineNo">868</span>                        }<a name="line.868"></a>
<span class="sourceLineNo">869</span>                }<a name="line.869"></a>
<span class="sourceLineNo">870</span>                return true;<a name="line.870"></a>
<span class="sourceLineNo">871</span>        }<a name="line.871"></a>
<span class="sourceLineNo">872</span><a name="line.872"></a>
<span class="sourceLineNo">873</span>        /**<a name="line.873"></a>
<span class="sourceLineNo">874</span>         * Test if all items along given axis are true in the input dataset<a name="line.874"></a>
<span class="sourceLineNo">875</span>         * @param a<a name="line.875"></a>
<span class="sourceLineNo">876</span>         * @param axis axis to reduce <a name="line.876"></a>
<span class="sourceLineNo">877</span>         * @return boolean dataset<a name="line.877"></a>
<span class="sourceLineNo">878</span>         */<a name="line.878"></a>
<span class="sourceLineNo">879</span>        public static BooleanDataset allTrue(IDataset a, int axis) {<a name="line.879"></a>
<span class="sourceLineNo">880</span>                axis = ShapeUtils.checkAxis(a.getRank(), axis);<a name="line.880"></a>
<span class="sourceLineNo">881</span><a name="line.881"></a>
<span class="sourceLineNo">882</span>                int rank = a.getRank();<a name="line.882"></a>
<span class="sourceLineNo">883</span>                int[] oshape = a.getShape();<a name="line.883"></a>
<span class="sourceLineNo">884</span>                int alen = oshape[axis];<a name="line.884"></a>
<span class="sourceLineNo">885</span>                oshape[axis] = 1;<a name="line.885"></a>
<span class="sourceLineNo">886</span><a name="line.886"></a>
<span class="sourceLineNo">887</span>                int[] nshape = ShapeUtils.squeezeShape(oshape, false);<a name="line.887"></a>
<span class="sourceLineNo">888</span><a name="line.888"></a>
<span class="sourceLineNo">889</span>                BooleanDataset result = DatasetFactory.zeros(BooleanDataset.class, nshape);<a name="line.889"></a>
<span class="sourceLineNo">890</span><a name="line.890"></a>
<span class="sourceLineNo">891</span>                IndexIterator qiter = result.getIterator(true);<a name="line.891"></a>
<span class="sourceLineNo">892</span>                int[] qpos = qiter.getPos();<a name="line.892"></a>
<span class="sourceLineNo">893</span>                int[] spos = oshape;<a name="line.893"></a>
<span class="sourceLineNo">894</span><a name="line.894"></a>
<span class="sourceLineNo">895</span>                while (qiter.hasNext()) {<a name="line.895"></a>
<span class="sourceLineNo">896</span>                        int i = 0;<a name="line.896"></a>
<span class="sourceLineNo">897</span>                        for (; i &lt; axis; i++) {<a name="line.897"></a>
<span class="sourceLineNo">898</span>                                spos[i] = qpos[i];<a name="line.898"></a>
<span class="sourceLineNo">899</span>                        }<a name="line.899"></a>
<span class="sourceLineNo">900</span>                        spos[i++] = 0;<a name="line.900"></a>
<span class="sourceLineNo">901</span>                        for (; i &lt; rank; i++) {<a name="line.901"></a>
<span class="sourceLineNo">902</span>                                spos[i] = qpos[i-1];<a name="line.902"></a>
<span class="sourceLineNo">903</span>                        }<a name="line.903"></a>
<span class="sourceLineNo">904</span><a name="line.904"></a>
<span class="sourceLineNo">905</span>                        boolean br = true;<a name="line.905"></a>
<span class="sourceLineNo">906</span>                        for (int j = 0; br &amp;&amp; j &lt; alen; j++) {<a name="line.906"></a>
<span class="sourceLineNo">907</span>                                spos[axis] = j;<a name="line.907"></a>
<span class="sourceLineNo">908</span>                                br &amp;= a.getBoolean(spos);<a name="line.908"></a>
<span class="sourceLineNo">909</span>                        }<a name="line.909"></a>
<span class="sourceLineNo">910</span>                        result.set(br, qpos);<a name="line.910"></a>
<span class="sourceLineNo">911</span>                }<a name="line.911"></a>
<span class="sourceLineNo">912</span>                return result;<a name="line.912"></a>
<span class="sourceLineNo">913</span>        }<a name="line.913"></a>
<span class="sourceLineNo">914</span><a name="line.914"></a>
<span class="sourceLineNo">915</span>        /**<a name="line.915"></a>
<span class="sourceLineNo">916</span>         * @param a<a name="line.916"></a>
<span class="sourceLineNo">917</span>         * @return true if any element is true<a name="line.917"></a>
<span class="sourceLineNo">918</span>         */<a name="line.918"></a>
<span class="sourceLineNo">919</span>        public static boolean anyTrue(Object a) {<a name="line.919"></a>
<span class="sourceLineNo">920</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.920"></a>
<span class="sourceLineNo">921</span>                final IndexIterator it = da.getIterator();<a name="line.921"></a>
<span class="sourceLineNo">922</span>                final int as = da.getElementsPerItem();<a name="line.922"></a>
<span class="sourceLineNo">923</span><a name="line.923"></a>
<span class="sourceLineNo">924</span>                if (as == 1) {<a name="line.924"></a>
<span class="sourceLineNo">925</span>                        while (it.hasNext()) {<a name="line.925"></a>
<span class="sourceLineNo">926</span>                                if (da.getElementBooleanAbs(it.index))<a name="line.926"></a>
<span class="sourceLineNo">927</span>                                        return true;<a name="line.927"></a>
<span class="sourceLineNo">928</span>                        }<a name="line.928"></a>
<span class="sourceLineNo">929</span>                } else {<a name="line.929"></a>
<span class="sourceLineNo">930</span>                        while (it.hasNext()) {<a name="line.930"></a>
<span class="sourceLineNo">931</span>                                for (int j = 0; j &lt; as; j++) {<a name="line.931"></a>
<span class="sourceLineNo">932</span>                                        if (da.getElementBooleanAbs(it.index + j))<a name="line.932"></a>
<span class="sourceLineNo">933</span>                                                return true;<a name="line.933"></a>
<span class="sourceLineNo">934</span>                                }<a name="line.934"></a>
<span class="sourceLineNo">935</span>                        }<a name="line.935"></a>
<span class="sourceLineNo">936</span>                }<a name="line.936"></a>
<span class="sourceLineNo">937</span>                return false;<a name="line.937"></a>
<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
<span class="sourceLineNo">939</span><a name="line.939"></a>
<span class="sourceLineNo">940</span>        /**<a name="line.940"></a>
<span class="sourceLineNo">941</span>         * Test if any items along given axis are true in the input dataset<a name="line.941"></a>
<span class="sourceLineNo">942</span>         * @param a<a name="line.942"></a>
<span class="sourceLineNo">943</span>         * @param axis axis to reduce <a name="line.943"></a>
<span class="sourceLineNo">944</span>         * @return boolean dataset<a name="line.944"></a>
<span class="sourceLineNo">945</span>         */<a name="line.945"></a>
<span class="sourceLineNo">946</span>        public static BooleanDataset anyTrue(IDataset a, int axis) {<a name="line.946"></a>
<span class="sourceLineNo">947</span>                axis = ShapeUtils.checkAxis(a.getRank(), axis);<a name="line.947"></a>
<span class="sourceLineNo">948</span><a name="line.948"></a>
<span class="sourceLineNo">949</span>                int rank = a.getRank();<a name="line.949"></a>
<span class="sourceLineNo">950</span>                int[] oshape = a.getShape();<a name="line.950"></a>
<span class="sourceLineNo">951</span>                int alen = oshape[axis];<a name="line.951"></a>
<span class="sourceLineNo">952</span>                oshape[axis] = 1;<a name="line.952"></a>
<span class="sourceLineNo">953</span><a name="line.953"></a>
<span class="sourceLineNo">954</span>                int[] nshape = ShapeUtils.squeezeShape(oshape, false);<a name="line.954"></a>
<span class="sourceLineNo">955</span><a name="line.955"></a>
<span class="sourceLineNo">956</span>                BooleanDataset result = DatasetFactory.zeros(BooleanDataset.class, nshape);<a name="line.956"></a>
<span class="sourceLineNo">957</span><a name="line.957"></a>
<span class="sourceLineNo">958</span>                IndexIterator qiter = result.getIterator(true);<a name="line.958"></a>
<span class="sourceLineNo">959</span>                int[] qpos = qiter.getPos();<a name="line.959"></a>
<span class="sourceLineNo">960</span>                int[] spos = oshape;<a name="line.960"></a>
<span class="sourceLineNo">961</span><a name="line.961"></a>
<span class="sourceLineNo">962</span>                while (qiter.hasNext()) {<a name="line.962"></a>
<span class="sourceLineNo">963</span>                        int i = 0;<a name="line.963"></a>
<span class="sourceLineNo">964</span>                        for (; i &lt; axis; i++) {<a name="line.964"></a>
<span class="sourceLineNo">965</span>                                spos[i] = qpos[i];<a name="line.965"></a>
<span class="sourceLineNo">966</span>                        }<a name="line.966"></a>
<span class="sourceLineNo">967</span>                        spos[i++] = 0;<a name="line.967"></a>
<span class="sourceLineNo">968</span>                        for (; i &lt; rank; i++) {<a name="line.968"></a>
<span class="sourceLineNo">969</span>                                spos[i] = qpos[i-1];<a name="line.969"></a>
<span class="sourceLineNo">970</span>                        }<a name="line.970"></a>
<span class="sourceLineNo">971</span><a name="line.971"></a>
<span class="sourceLineNo">972</span>                        boolean br = false;<a name="line.972"></a>
<span class="sourceLineNo">973</span>                        for (int j = 0; !br &amp;&amp; j &lt; alen; j++) {<a name="line.973"></a>
<span class="sourceLineNo">974</span>                                spos[axis] = j;<a name="line.974"></a>
<span class="sourceLineNo">975</span>                                br |= a.getBoolean(spos);<a name="line.975"></a>
<span class="sourceLineNo">976</span>                        }<a name="line.976"></a>
<span class="sourceLineNo">977</span>                        result.set(br, qpos);<a name="line.977"></a>
<span class="sourceLineNo">978</span>                }<a name="line.978"></a>
<span class="sourceLineNo">979</span>                return result;<a name="line.979"></a>
<span class="sourceLineNo">980</span>        }<a name="line.980"></a>
<span class="sourceLineNo">981</span><a name="line.981"></a>
<span class="sourceLineNo">982</span>        /**<a name="line.982"></a>
<span class="sourceLineNo">983</span>         * Negate item-wise<a name="line.983"></a>
<span class="sourceLineNo">984</span>         * &lt;p&gt;<a name="line.984"></a>
<span class="sourceLineNo">985</span>         * For multi-element items, negation is false if all elements in a pair of items<a name="line.985"></a>
<span class="sourceLineNo">986</span>         * are true.<a name="line.986"></a>
<span class="sourceLineNo">987</span>         * @param a<a name="line.987"></a>
<span class="sourceLineNo">988</span>         * @return dataset where item is true when a is false<a name="line.988"></a>
<span class="sourceLineNo">989</span>         */<a name="line.989"></a>
<span class="sourceLineNo">990</span>        public static BooleanDataset logicalNot(Object a) {<a name="line.990"></a>
<span class="sourceLineNo">991</span>                return logicalNot(a, null);<a name="line.991"></a>
<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
<span class="sourceLineNo">993</span><a name="line.993"></a>
<span class="sourceLineNo">994</span>        /**<a name="line.994"></a>
<span class="sourceLineNo">995</span>         * Negate item-wise<a name="line.995"></a>
<span class="sourceLineNo">996</span>         * &lt;p&gt;<a name="line.996"></a>
<span class="sourceLineNo">997</span>         * For multi-element items, negation is false if all elements in a pair of items<a name="line.997"></a>
<span class="sourceLineNo">998</span>         * are true.<a name="line.998"></a>
<span class="sourceLineNo">999</span>         * @param a<a name="line.999"></a>
<span class="sourceLineNo">1000</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1000"></a>
<span class="sourceLineNo">1001</span>         * @return dataset where item is true when a is false<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>         */<a name="line.1002"></a>
<span class="sourceLineNo">1003</span>        public static BooleanDataset logicalNot(Object a, BooleanDataset o) {<a name="line.1003"></a>
<span class="sourceLineNo">1004</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1004"></a>
<span class="sourceLineNo">1005</span><a name="line.1005"></a>
<span class="sourceLineNo">1006</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1006"></a>
<span class="sourceLineNo">1007</span><a name="line.1007"></a>
<span class="sourceLineNo">1008</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1008"></a>
<span class="sourceLineNo">1009</span><a name="line.1009"></a>
<span class="sourceLineNo">1010</span>                final SingleInputBroadcastIterator it = new SingleInputBroadcastIterator(da, r);<a name="line.1010"></a>
<span class="sourceLineNo">1011</span>                final int as = da.getElementsPerItem();<a name="line.1011"></a>
<span class="sourceLineNo">1012</span><a name="line.1012"></a>
<span class="sourceLineNo">1013</span>                if (as == 1) {<a name="line.1013"></a>
<span class="sourceLineNo">1014</span>                        while (it.hasNext()) {<a name="line.1014"></a>
<span class="sourceLineNo">1015</span>                                r.setAbs(it.oIndex, !da.getElementBooleanAbs(it.aIndex));<a name="line.1015"></a>
<span class="sourceLineNo">1016</span>                        }<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>                } else {<a name="line.1017"></a>
<span class="sourceLineNo">1018</span>                        boolean br = true;<a name="line.1018"></a>
<span class="sourceLineNo">1019</span>                        while (it.hasNext()) {<a name="line.1019"></a>
<span class="sourceLineNo">1020</span>                                for (int j = 0; j &lt; as; j++) {<a name="line.1020"></a>
<span class="sourceLineNo">1021</span>                                        br &amp;= da.getElementBooleanAbs(it.aIndex + j);<a name="line.1021"></a>
<span class="sourceLineNo">1022</span>                                }<a name="line.1022"></a>
<span class="sourceLineNo">1023</span>                                r.setAbs(it.oIndex, !br);<a name="line.1023"></a>
<span class="sourceLineNo">1024</span>                        }<a name="line.1024"></a>
<span class="sourceLineNo">1025</span>                }<a name="line.1025"></a>
<span class="sourceLineNo">1026</span>                return r;<a name="line.1026"></a>
<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
<span class="sourceLineNo">1028</span><a name="line.1028"></a>
<span class="sourceLineNo">1029</span>        /**<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>         * Compare item-wise for whether a's item is true and b's true too.<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>         * &lt;p&gt;<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>         * For multi-element items, comparison is true if all elements in a pair of items<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>         * are true. Where the datasets have mismatched item sizes, the first element<a name="line.1033"></a>
<span class="sourceLineNo">1034</span>         * of the dataset with smaller items is used for comparison.<a name="line.1034"></a>
<span class="sourceLineNo">1035</span>         * @param a<a name="line.1035"></a>
<span class="sourceLineNo">1036</span>         * @param b<a name="line.1036"></a>
<span class="sourceLineNo">1037</span>         * @return dataset where item is true if {@code a &amp;&amp; b} is true<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>         */<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>        public static BooleanDataset logicalAnd(Object a, Object b) {<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>                return logicalAnd(a, b, null);<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
<span class="sourceLineNo">1042</span><a name="line.1042"></a>
<span class="sourceLineNo">1043</span>        /**<a name="line.1043"></a>
<span class="sourceLineNo">1044</span>         * Compare item-wise for whether a's item is true and b's true too.<a name="line.1044"></a>
<span class="sourceLineNo">1045</span>         * &lt;p&gt;<a name="line.1045"></a>
<span class="sourceLineNo">1046</span>         * For multi-element items, comparison is true if all elements in a pair of items<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>         * are true. Where the datasets have mismatched item sizes, the first element<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>         * of the dataset with smaller items is used for comparison.<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>         * @param a<a name="line.1049"></a>
<span class="sourceLineNo">1050</span>         * @param b<a name="line.1050"></a>
<span class="sourceLineNo">1051</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1051"></a>
<span class="sourceLineNo">1052</span>         * @return dataset where item is true if {@code a &amp;&amp; b} is true<a name="line.1052"></a>
<span class="sourceLineNo">1053</span>         */<a name="line.1053"></a>
<span class="sourceLineNo">1054</span>        public static BooleanDataset logicalAnd(Object a, Object b, BooleanDataset o) {<a name="line.1054"></a>
<span class="sourceLineNo">1055</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1055"></a>
<span class="sourceLineNo">1056</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1056"></a>
<span class="sourceLineNo">1057</span><a name="line.1057"></a>
<span class="sourceLineNo">1058</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1058"></a>
<span class="sourceLineNo">1059</span><a name="line.1059"></a>
<span class="sourceLineNo">1060</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1060"></a>
<span class="sourceLineNo">1061</span><a name="line.1061"></a>
<span class="sourceLineNo">1062</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.1062"></a>
<span class="sourceLineNo">1063</span>                it.setOutputDouble(true);<a name="line.1063"></a>
<span class="sourceLineNo">1064</span>                final int as = da.getElementsPerItem();<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>                final int bs = db.getElementsPerItem();<a name="line.1065"></a>
<span class="sourceLineNo">1066</span><a name="line.1066"></a>
<span class="sourceLineNo">1067</span>                if (as &gt; bs) {<a name="line.1067"></a>
<span class="sourceLineNo">1068</span>                        while (it.hasNext()) {<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>                                final boolean bb = db.getElementBooleanAbs(it.bIndex);<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>                                boolean rb = true;<a name="line.1070"></a>
<span class="sourceLineNo">1071</span>                                for (int j = 0; rb &amp;&amp; j &lt; as; j++) {<a name="line.1071"></a>
<span class="sourceLineNo">1072</span>                                        rb &amp;= da.getElementBooleanAbs(it.aIndex + j) &amp;&amp; bb;<a name="line.1072"></a>
<span class="sourceLineNo">1073</span>                                }<a name="line.1073"></a>
<span class="sourceLineNo">1074</span>                                r.setAbs(it.oIndex, rb);<a name="line.1074"></a>
<span class="sourceLineNo">1075</span>                        }<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>                } else if (as &lt; bs) {<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>                        while (it.hasNext()) {<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>                                final boolean ab = da.getElementBooleanAbs(it.aIndex);<a name="line.1078"></a>
<span class="sourceLineNo">1079</span>                                boolean rb = true;<a name="line.1079"></a>
<span class="sourceLineNo">1080</span>                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>                                        rb &amp;= ab &amp;&amp; db.getElementBooleanAbs(it.bIndex + j);<a name="line.1081"></a>
<span class="sourceLineNo">1082</span>                                }<a name="line.1082"></a>
<span class="sourceLineNo">1083</span>                                r.setAbs(it.oIndex, rb);<a name="line.1083"></a>
<span class="sourceLineNo">1084</span>                        }<a name="line.1084"></a>
<span class="sourceLineNo">1085</span>                } else {<a name="line.1085"></a>
<span class="sourceLineNo">1086</span>                        if (as == 1) {<a name="line.1086"></a>
<span class="sourceLineNo">1087</span>                                while (it.hasNext()) {<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>                                        r.setAbs(it.oIndex, da.getElementBooleanAbs(it.aIndex) &amp;&amp; db.getElementBooleanAbs(it.bIndex));<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>                                }<a name="line.1089"></a>
<span class="sourceLineNo">1090</span>                        } else {<a name="line.1090"></a>
<span class="sourceLineNo">1091</span>                                while (it.hasNext()) {<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>                                        boolean rb = true;<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.1093"></a>
<span class="sourceLineNo">1094</span>                                                rb &amp;= da.getElementBooleanAbs(it.aIndex + j) &amp;&amp; db.getElementBooleanAbs(it.bIndex + j);<a name="line.1094"></a>
<span class="sourceLineNo">1095</span>                                        }<a name="line.1095"></a>
<span class="sourceLineNo">1096</span>                                        r.setAbs(it.oIndex, rb);<a name="line.1096"></a>
<span class="sourceLineNo">1097</span>                                }<a name="line.1097"></a>
<span class="sourceLineNo">1098</span>                        }<a name="line.1098"></a>
<span class="sourceLineNo">1099</span>                }<a name="line.1099"></a>
<span class="sourceLineNo">1100</span><a name="line.1100"></a>
<span class="sourceLineNo">1101</span>                return r;<a name="line.1101"></a>
<span class="sourceLineNo">1102</span>        }<a name="line.1102"></a>
<span class="sourceLineNo">1103</span><a name="line.1103"></a>
<span class="sourceLineNo">1104</span>        /**<a name="line.1104"></a>
<span class="sourceLineNo">1105</span>         * Compare item-wise for whether a's item is true or b's true.<a name="line.1105"></a>
<span class="sourceLineNo">1106</span>         * &lt;p&gt;<a name="line.1106"></a>
<span class="sourceLineNo">1107</span>         * For multi-element items, comparison is true if any elements in a pair of items<a name="line.1107"></a>
<span class="sourceLineNo">1108</span>         * are true. Where the datasets have mismatched item sizes, the first element<a name="line.1108"></a>
<span class="sourceLineNo">1109</span>         * of the dataset with smaller items is used for comparison.<a name="line.1109"></a>
<span class="sourceLineNo">1110</span>         * @param a<a name="line.1110"></a>
<span class="sourceLineNo">1111</span>         * @param b<a name="line.1111"></a>
<span class="sourceLineNo">1112</span>         * @return dataset where item is true if {@code a || b} is true<a name="line.1112"></a>
<span class="sourceLineNo">1113</span>         */<a name="line.1113"></a>
<span class="sourceLineNo">1114</span>        public static BooleanDataset logicalOr(Object a, Object b) {<a name="line.1114"></a>
<span class="sourceLineNo">1115</span>                return logicalOr(a, b, null);<a name="line.1115"></a>
<span class="sourceLineNo">1116</span>        }<a name="line.1116"></a>
<span class="sourceLineNo">1117</span><a name="line.1117"></a>
<span class="sourceLineNo">1118</span>        /**<a name="line.1118"></a>
<span class="sourceLineNo">1119</span>         * Compare item-wise for whether a's item is true or b's true.<a name="line.1119"></a>
<span class="sourceLineNo">1120</span>         * &lt;p&gt;<a name="line.1120"></a>
<span class="sourceLineNo">1121</span>         * For multi-element items, comparison is true if any elements in a pair of items<a name="line.1121"></a>
<span class="sourceLineNo">1122</span>         * are true. Where the datasets have mismatched item sizes, the first element<a name="line.1122"></a>
<span class="sourceLineNo">1123</span>         * of the dataset with smaller items is used for comparison.<a name="line.1123"></a>
<span class="sourceLineNo">1124</span>         * @param a<a name="line.1124"></a>
<span class="sourceLineNo">1125</span>         * @param b<a name="line.1125"></a>
<span class="sourceLineNo">1126</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1126"></a>
<span class="sourceLineNo">1127</span>         * @return dataset where item is true if {@code a || b} is true<a name="line.1127"></a>
<span class="sourceLineNo">1128</span>         */<a name="line.1128"></a>
<span class="sourceLineNo">1129</span>        public static BooleanDataset logicalOr(Object a, Object b, BooleanDataset o) {<a name="line.1129"></a>
<span class="sourceLineNo">1130</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1130"></a>
<span class="sourceLineNo">1131</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1131"></a>
<span class="sourceLineNo">1132</span><a name="line.1132"></a>
<span class="sourceLineNo">1133</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1133"></a>
<span class="sourceLineNo">1134</span><a name="line.1134"></a>
<span class="sourceLineNo">1135</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1135"></a>
<span class="sourceLineNo">1136</span><a name="line.1136"></a>
<span class="sourceLineNo">1137</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.1137"></a>
<span class="sourceLineNo">1138</span>                it.setOutputDouble(true);<a name="line.1138"></a>
<span class="sourceLineNo">1139</span>                final int as = da.getElementsPerItem();<a name="line.1139"></a>
<span class="sourceLineNo">1140</span>                final int bs = db.getElementsPerItem();<a name="line.1140"></a>
<span class="sourceLineNo">1141</span><a name="line.1141"></a>
<span class="sourceLineNo">1142</span>                if (as &gt; bs) {<a name="line.1142"></a>
<span class="sourceLineNo">1143</span>                        while (it.hasNext()) {<a name="line.1143"></a>
<span class="sourceLineNo">1144</span>                                final boolean bb = db.getElementBooleanAbs(it.bIndex);<a name="line.1144"></a>
<span class="sourceLineNo">1145</span>                                boolean rb = true;<a name="line.1145"></a>
<span class="sourceLineNo">1146</span>                                for (int j = 0; j &lt; as; j++) {<a name="line.1146"></a>
<span class="sourceLineNo">1147</span>                                        rb |= da.getElementBooleanAbs(it.aIndex + j) || bb;<a name="line.1147"></a>
<span class="sourceLineNo">1148</span>                                }<a name="line.1148"></a>
<span class="sourceLineNo">1149</span>                                r.setAbs(it.oIndex, rb);<a name="line.1149"></a>
<span class="sourceLineNo">1150</span>                        }<a name="line.1150"></a>
<span class="sourceLineNo">1151</span>                } else if (as &lt; bs) {<a name="line.1151"></a>
<span class="sourceLineNo">1152</span>                        while (it.hasNext()) {<a name="line.1152"></a>
<span class="sourceLineNo">1153</span>                                final boolean ab = da.getElementBooleanAbs(it.aIndex);<a name="line.1153"></a>
<span class="sourceLineNo">1154</span>                                boolean rb = true;<a name="line.1154"></a>
<span class="sourceLineNo">1155</span>                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.1155"></a>
<span class="sourceLineNo">1156</span>                                        rb |= ab || db.getElementBooleanAbs(it.bIndex + j);<a name="line.1156"></a>
<span class="sourceLineNo">1157</span>                                }<a name="line.1157"></a>
<span class="sourceLineNo">1158</span>                                r.setAbs(it.oIndex, rb);<a name="line.1158"></a>
<span class="sourceLineNo">1159</span>                        }<a name="line.1159"></a>
<span class="sourceLineNo">1160</span>                } else {<a name="line.1160"></a>
<span class="sourceLineNo">1161</span>                        if (as == 1) {<a name="line.1161"></a>
<span class="sourceLineNo">1162</span>                                while (it.hasNext()) {<a name="line.1162"></a>
<span class="sourceLineNo">1163</span>                                        r.setAbs(it.oIndex, da.getElementBooleanAbs(it.aIndex) || db.getElementBooleanAbs(it.bIndex));<a name="line.1163"></a>
<span class="sourceLineNo">1164</span>                                }<a name="line.1164"></a>
<span class="sourceLineNo">1165</span>                        } else {<a name="line.1165"></a>
<span class="sourceLineNo">1166</span>                                while (it.hasNext()) {<a name="line.1166"></a>
<span class="sourceLineNo">1167</span>                                        boolean rb = true;<a name="line.1167"></a>
<span class="sourceLineNo">1168</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.1168"></a>
<span class="sourceLineNo">1169</span>                                                rb &amp;= da.getElementBooleanAbs(it.aIndex + j) || db.getElementBooleanAbs(it.bIndex + j);<a name="line.1169"></a>
<span class="sourceLineNo">1170</span>                                        }<a name="line.1170"></a>
<span class="sourceLineNo">1171</span>                                        r.setAbs(it.oIndex, rb);<a name="line.1171"></a>
<span class="sourceLineNo">1172</span>                                }<a name="line.1172"></a>
<span class="sourceLineNo">1173</span>                        }<a name="line.1173"></a>
<span class="sourceLineNo">1174</span>                }<a name="line.1174"></a>
<span class="sourceLineNo">1175</span><a name="line.1175"></a>
<span class="sourceLineNo">1176</span>                return r;<a name="line.1176"></a>
<span class="sourceLineNo">1177</span>        }<a name="line.1177"></a>
<span class="sourceLineNo">1178</span><a name="line.1178"></a>
<span class="sourceLineNo">1179</span>        /**<a name="line.1179"></a>
<span class="sourceLineNo">1180</span>         * Compare item-wise for whether a's item is true or b's true exclusively.<a name="line.1180"></a>
<span class="sourceLineNo">1181</span>         * &lt;p&gt;<a name="line.1181"></a>
<span class="sourceLineNo">1182</span>         * For multi-element items, comparison is true if one element in a pair of items<a name="line.1182"></a>
<span class="sourceLineNo">1183</span>         * is true. Where the datasets have mismatched item sizes, the first element<a name="line.1183"></a>
<span class="sourceLineNo">1184</span>         * of the dataset with smaller items is used for comparison.<a name="line.1184"></a>
<span class="sourceLineNo">1185</span>         * @param a<a name="line.1185"></a>
<span class="sourceLineNo">1186</span>         * @param b<a name="line.1186"></a>
<span class="sourceLineNo">1187</span>         * @return dataset where item is true if {@code a ^ b} is true<a name="line.1187"></a>
<span class="sourceLineNo">1188</span>         */<a name="line.1188"></a>
<span class="sourceLineNo">1189</span>        public static BooleanDataset logicalXor(Object a, Object b) {<a name="line.1189"></a>
<span class="sourceLineNo">1190</span>                return logicalXor(a, b, null);<a name="line.1190"></a>
<span class="sourceLineNo">1191</span>        }<a name="line.1191"></a>
<span class="sourceLineNo">1192</span><a name="line.1192"></a>
<span class="sourceLineNo">1193</span>        /**<a name="line.1193"></a>
<span class="sourceLineNo">1194</span>         * Compare item-wise for whether a's item is true or b's true exclusively.<a name="line.1194"></a>
<span class="sourceLineNo">1195</span>         * &lt;p&gt;<a name="line.1195"></a>
<span class="sourceLineNo">1196</span>         * For multi-element items, comparison is true if one element in a pair of items<a name="line.1196"></a>
<span class="sourceLineNo">1197</span>         * is true. Where the datasets have mismatched item sizes, the first element<a name="line.1197"></a>
<span class="sourceLineNo">1198</span>         * of the dataset with smaller items is used for comparison.<a name="line.1198"></a>
<span class="sourceLineNo">1199</span>         * @param a<a name="line.1199"></a>
<span class="sourceLineNo">1200</span>         * @param b<a name="line.1200"></a>
<span class="sourceLineNo">1201</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1201"></a>
<span class="sourceLineNo">1202</span>         * @return dataset where item is true if a ^ b is true<a name="line.1202"></a>
<span class="sourceLineNo">1203</span>         */<a name="line.1203"></a>
<span class="sourceLineNo">1204</span>        public static BooleanDataset logicalXor(Object a, Object b, BooleanDataset o) {<a name="line.1204"></a>
<span class="sourceLineNo">1205</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1205"></a>
<span class="sourceLineNo">1206</span>                final Dataset db = b instanceof Dataset ? (Dataset) b : DatasetFactory.createFromObject(b);<a name="line.1206"></a>
<span class="sourceLineNo">1207</span><a name="line.1207"></a>
<span class="sourceLineNo">1208</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), db.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1208"></a>
<span class="sourceLineNo">1209</span><a name="line.1209"></a>
<span class="sourceLineNo">1210</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1210"></a>
<span class="sourceLineNo">1211</span><a name="line.1211"></a>
<span class="sourceLineNo">1212</span>                final BroadcastIterator it = BroadcastIterator.createIterator(da, db, r);<a name="line.1212"></a>
<span class="sourceLineNo">1213</span>                it.setOutputDouble(true);<a name="line.1213"></a>
<span class="sourceLineNo">1214</span>                final int as = da.getElementsPerItem();<a name="line.1214"></a>
<span class="sourceLineNo">1215</span>                final int bs = db.getElementsPerItem();<a name="line.1215"></a>
<span class="sourceLineNo">1216</span><a name="line.1216"></a>
<span class="sourceLineNo">1217</span>                if (as &gt; bs) {<a name="line.1217"></a>
<span class="sourceLineNo">1218</span>                        while (it.hasNext()) {<a name="line.1218"></a>
<span class="sourceLineNo">1219</span>                                boolean rb = db.getElementBooleanAbs(it.bIndex);<a name="line.1219"></a>
<span class="sourceLineNo">1220</span>                                for (int j = 0; j &lt; as; j++) {<a name="line.1220"></a>
<span class="sourceLineNo">1221</span>                                        rb ^= da.getElementBooleanAbs(it.aIndex + j);<a name="line.1221"></a>
<span class="sourceLineNo">1222</span>                                }<a name="line.1222"></a>
<span class="sourceLineNo">1223</span>                                r.setAbs(it.oIndex, rb);<a name="line.1223"></a>
<span class="sourceLineNo">1224</span>                        }<a name="line.1224"></a>
<span class="sourceLineNo">1225</span>                } else if (as &lt; bs) {<a name="line.1225"></a>
<span class="sourceLineNo">1226</span>                        while (it.hasNext()) {<a name="line.1226"></a>
<span class="sourceLineNo">1227</span>                                boolean rb = da.getElementBooleanAbs(it.aIndex);<a name="line.1227"></a>
<span class="sourceLineNo">1228</span>                                for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.1228"></a>
<span class="sourceLineNo">1229</span>                                        rb ^= db.getElementBooleanAbs(it.bIndex + j);<a name="line.1229"></a>
<span class="sourceLineNo">1230</span>                                }<a name="line.1230"></a>
<span class="sourceLineNo">1231</span>                                r.setAbs(it.oIndex, rb);<a name="line.1231"></a>
<span class="sourceLineNo">1232</span>                        }<a name="line.1232"></a>
<span class="sourceLineNo">1233</span>                } else {<a name="line.1233"></a>
<span class="sourceLineNo">1234</span>                        if (as == 1) {<a name="line.1234"></a>
<span class="sourceLineNo">1235</span>                                while (it.hasNext()) {<a name="line.1235"></a>
<span class="sourceLineNo">1236</span>                                        r.setAbs(it.oIndex, da.getElementBooleanAbs(it.aIndex) ^ db.getElementBooleanAbs(it.bIndex));<a name="line.1236"></a>
<span class="sourceLineNo">1237</span>                                }<a name="line.1237"></a>
<span class="sourceLineNo">1238</span>                        } else {<a name="line.1238"></a>
<span class="sourceLineNo">1239</span>                                while (it.hasNext()) {<a name="line.1239"></a>
<span class="sourceLineNo">1240</span>                                        boolean rb = true;<a name="line.1240"></a>
<span class="sourceLineNo">1241</span>                                        for (int j = 0; rb &amp;&amp; j &lt; bs; j++) {<a name="line.1241"></a>
<span class="sourceLineNo">1242</span>                                                rb &amp;= da.getElementBooleanAbs(it.aIndex + j) ^ db.getElementBooleanAbs(it.bIndex + j);<a name="line.1242"></a>
<span class="sourceLineNo">1243</span>                                        }<a name="line.1243"></a>
<span class="sourceLineNo">1244</span>                                        r.setAbs(it.oIndex, rb);<a name="line.1244"></a>
<span class="sourceLineNo">1245</span>                                }<a name="line.1245"></a>
<span class="sourceLineNo">1246</span>                        }<a name="line.1246"></a>
<span class="sourceLineNo">1247</span>                }<a name="line.1247"></a>
<span class="sourceLineNo">1248</span><a name="line.1248"></a>
<span class="sourceLineNo">1249</span>                return r;<a name="line.1249"></a>
<span class="sourceLineNo">1250</span>        }<a name="line.1250"></a>
<span class="sourceLineNo">1251</span><a name="line.1251"></a>
<span class="sourceLineNo">1252</span>        /**<a name="line.1252"></a>
<span class="sourceLineNo">1253</span>         * Create a list of indices of positions where items are non-zero<a name="line.1253"></a>
<span class="sourceLineNo">1254</span>         * @param a<a name="line.1254"></a>
<span class="sourceLineNo">1255</span>         * @return list of positions as integer datasets<a name="line.1255"></a>
<span class="sourceLineNo">1256</span>         */<a name="line.1256"></a>
<span class="sourceLineNo">1257</span>        public static List&lt;IntegerDataset&gt; nonZero(Dataset a) {<a name="line.1257"></a>
<span class="sourceLineNo">1258</span>                final int rank = a.getRank();<a name="line.1258"></a>
<span class="sourceLineNo">1259</span>                final List&lt;List&lt;Integer&gt;&gt; indices = new ArrayList&lt;List&lt;Integer&gt;&gt;();<a name="line.1259"></a>
<span class="sourceLineNo">1260</span>                List&lt;IntegerDataset&gt; indexList = new ArrayList&lt;IntegerDataset&gt;();<a name="line.1260"></a>
<span class="sourceLineNo">1261</span><a name="line.1261"></a>
<span class="sourceLineNo">1262</span>                if (rank == 0)<a name="line.1262"></a>
<span class="sourceLineNo">1263</span>                        return indexList;<a name="line.1263"></a>
<span class="sourceLineNo">1264</span><a name="line.1264"></a>
<span class="sourceLineNo">1265</span>                for (int j = 0; j &lt; rank; j++) {<a name="line.1265"></a>
<span class="sourceLineNo">1266</span>                        indices.add(new ArrayList&lt;Integer&gt;());<a name="line.1266"></a>
<span class="sourceLineNo">1267</span>                }<a name="line.1267"></a>
<span class="sourceLineNo">1268</span><a name="line.1268"></a>
<span class="sourceLineNo">1269</span>                final IndexIterator iter = a.getIterator(true);<a name="line.1269"></a>
<span class="sourceLineNo">1270</span>                final int[] pos = iter.getPos();<a name="line.1270"></a>
<span class="sourceLineNo">1271</span>                while (iter.hasNext()) {<a name="line.1271"></a>
<span class="sourceLineNo">1272</span>                        if (a.getElementBooleanAbs(iter.index)) {<a name="line.1272"></a>
<span class="sourceLineNo">1273</span>                                for (int j = 0; j &lt; rank; j++) {<a name="line.1273"></a>
<span class="sourceLineNo">1274</span>                                        indices.get(j).add(pos[j]);<a name="line.1274"></a>
<span class="sourceLineNo">1275</span>                                }<a name="line.1275"></a>
<span class="sourceLineNo">1276</span>                        }<a name="line.1276"></a>
<span class="sourceLineNo">1277</span>                }<a name="line.1277"></a>
<span class="sourceLineNo">1278</span><a name="line.1278"></a>
<span class="sourceLineNo">1279</span>                for (int j = 0; j &lt; rank; j++) {<a name="line.1279"></a>
<span class="sourceLineNo">1280</span>                        indexList.add((IntegerDataset) DatasetFactory.createFromList(IntegerDataset.class, indices.get(j)));<a name="line.1280"></a>
<span class="sourceLineNo">1281</span>                }<a name="line.1281"></a>
<span class="sourceLineNo">1282</span>                return indexList;<a name="line.1282"></a>
<span class="sourceLineNo">1283</span>        }<a name="line.1283"></a>
<span class="sourceLineNo">1284</span><a name="line.1284"></a>
<span class="sourceLineNo">1285</span>        /**<a name="line.1285"></a>
<span class="sourceLineNo">1286</span>         * Check item-wise for whether any a's elements are Not-a-Numbers<a name="line.1286"></a>
<span class="sourceLineNo">1287</span>         * &lt;p&gt;<a name="line.1287"></a>
<span class="sourceLineNo">1288</span>         * For multi-element items, check is true if any elements in an item is Not-a-Number.<a name="line.1288"></a>
<span class="sourceLineNo">1289</span>         * @param a<a name="line.1289"></a>
<span class="sourceLineNo">1290</span>         * @return dataset where item is true if any of its elements are NaNs<a name="line.1290"></a>
<span class="sourceLineNo">1291</span>         */<a name="line.1291"></a>
<span class="sourceLineNo">1292</span>        public static BooleanDataset isNaN(Object a) {<a name="line.1292"></a>
<span class="sourceLineNo">1293</span>                return isNaN(a, null);<a name="line.1293"></a>
<span class="sourceLineNo">1294</span>        }<a name="line.1294"></a>
<span class="sourceLineNo">1295</span><a name="line.1295"></a>
<span class="sourceLineNo">1296</span>        /**<a name="line.1296"></a>
<span class="sourceLineNo">1297</span>         * Check item-wise for whether any a's elements are Not-a-Numbers<a name="line.1297"></a>
<span class="sourceLineNo">1298</span>         * &lt;p&gt;<a name="line.1298"></a>
<span class="sourceLineNo">1299</span>         * For multi-element items, check is true if any elements in an item is Not-a-Number.<a name="line.1299"></a>
<span class="sourceLineNo">1300</span>         * @param a<a name="line.1300"></a>
<span class="sourceLineNo">1301</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1301"></a>
<span class="sourceLineNo">1302</span>         * @return dataset where item is true if any of its elements are NaNs<a name="line.1302"></a>
<span class="sourceLineNo">1303</span>         */<a name="line.1303"></a>
<span class="sourceLineNo">1304</span>        public static BooleanDataset isNaN(Object a, BooleanDataset o) {<a name="line.1304"></a>
<span class="sourceLineNo">1305</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1305"></a>
<span class="sourceLineNo">1306</span><a name="line.1306"></a>
<span class="sourceLineNo">1307</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1307"></a>
<span class="sourceLineNo">1308</span><a name="line.1308"></a>
<span class="sourceLineNo">1309</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1309"></a>
<span class="sourceLineNo">1310</span><a name="line.1310"></a>
<span class="sourceLineNo">1311</span>                if (!da.hasFloatingPointElements()) {<a name="line.1311"></a>
<span class="sourceLineNo">1312</span>                        if (r == o) {<a name="line.1312"></a>
<span class="sourceLineNo">1313</span>                                r.fill(false);<a name="line.1313"></a>
<span class="sourceLineNo">1314</span>                        }<a name="line.1314"></a>
<span class="sourceLineNo">1315</span>                        return r;<a name="line.1315"></a>
<span class="sourceLineNo">1316</span>                }<a name="line.1316"></a>
<span class="sourceLineNo">1317</span><a name="line.1317"></a>
<span class="sourceLineNo">1318</span>                final SingleInputBroadcastIterator it = new SingleInputBroadcastIterator(da, r);<a name="line.1318"></a>
<span class="sourceLineNo">1319</span>                it.setOutputDouble(true);<a name="line.1319"></a>
<span class="sourceLineNo">1320</span>                final int as = da.getElementsPerItem();<a name="line.1320"></a>
<span class="sourceLineNo">1321</span><a name="line.1321"></a>
<span class="sourceLineNo">1322</span>                if (as == 1) {<a name="line.1322"></a>
<span class="sourceLineNo">1323</span>                        while (it.hasNext()) {<a name="line.1323"></a>
<span class="sourceLineNo">1324</span>                                r.setAbs(it.oIndex, Double.isNaN(it.aDouble));<a name="line.1324"></a>
<span class="sourceLineNo">1325</span>                        }<a name="line.1325"></a>
<span class="sourceLineNo">1326</span>                } else {<a name="line.1326"></a>
<span class="sourceLineNo">1327</span>                        if (da instanceof ComplexFloatDataset || da instanceof ComplexDoubleDataset) {<a name="line.1327"></a>
<span class="sourceLineNo">1328</span>                                while (it.hasNext()) {<a name="line.1328"></a>
<span class="sourceLineNo">1329</span>                                        r.setAbs(it.oIndex, Double.isNaN(it.aDouble) || Double.isNaN(da.getElementDoubleAbs(it.aIndex + 1)));<a name="line.1329"></a>
<span class="sourceLineNo">1330</span>                                }<a name="line.1330"></a>
<span class="sourceLineNo">1331</span>                        } else {<a name="line.1331"></a>
<span class="sourceLineNo">1332</span>                                while (it.hasNext()) {<a name="line.1332"></a>
<span class="sourceLineNo">1333</span>                                        boolean rb = false;<a name="line.1333"></a>
<span class="sourceLineNo">1334</span>                                        for (int j = 0; !rb &amp;&amp; j &lt; as; j++) {<a name="line.1334"></a>
<span class="sourceLineNo">1335</span>                                                rb &amp;= Double.isNaN(da.getElementDoubleAbs(it.aIndex + j));<a name="line.1335"></a>
<span class="sourceLineNo">1336</span>                                        }<a name="line.1336"></a>
<span class="sourceLineNo">1337</span>                                        r.setAbs(it.oIndex, rb);<a name="line.1337"></a>
<span class="sourceLineNo">1338</span>                                }<a name="line.1338"></a>
<span class="sourceLineNo">1339</span>                        }<a name="line.1339"></a>
<span class="sourceLineNo">1340</span>                }<a name="line.1340"></a>
<span class="sourceLineNo">1341</span>                return r;<a name="line.1341"></a>
<span class="sourceLineNo">1342</span>        }<a name="line.1342"></a>
<span class="sourceLineNo">1343</span><a name="line.1343"></a>
<span class="sourceLineNo">1344</span>        /**<a name="line.1344"></a>
<span class="sourceLineNo">1345</span>         * Check item-wise for whether any a's elements are infinite<a name="line.1345"></a>
<span class="sourceLineNo">1346</span>         * &lt;p&gt;<a name="line.1346"></a>
<span class="sourceLineNo">1347</span>         * For multi-element items, check is true if any elements in an item is infinite<a name="line.1347"></a>
<span class="sourceLineNo">1348</span>         * @param a<a name="line.1348"></a>
<span class="sourceLineNo">1349</span>         * @return dataset where item is true if any of its elements are infinite<a name="line.1349"></a>
<span class="sourceLineNo">1350</span>         */<a name="line.1350"></a>
<span class="sourceLineNo">1351</span>        public static BooleanDataset isInfinite(Object a) {<a name="line.1351"></a>
<span class="sourceLineNo">1352</span>                return isInfinite(a, null);<a name="line.1352"></a>
<span class="sourceLineNo">1353</span>        }<a name="line.1353"></a>
<span class="sourceLineNo">1354</span><a name="line.1354"></a>
<span class="sourceLineNo">1355</span>        /**<a name="line.1355"></a>
<span class="sourceLineNo">1356</span>         * Check item-wise for whether any a's elements are infinite<a name="line.1356"></a>
<span class="sourceLineNo">1357</span>         * &lt;p&gt;<a name="line.1357"></a>
<span class="sourceLineNo">1358</span>         * For multi-element items, check is true if any elements in an item is infinite<a name="line.1358"></a>
<span class="sourceLineNo">1359</span>         * @param a<a name="line.1359"></a>
<span class="sourceLineNo">1360</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1360"></a>
<span class="sourceLineNo">1361</span>         * @return dataset where item is true if any of its elements are infinite<a name="line.1361"></a>
<span class="sourceLineNo">1362</span>         */<a name="line.1362"></a>
<span class="sourceLineNo">1363</span>        public static BooleanDataset isInfinite(Object a, BooleanDataset o) {<a name="line.1363"></a>
<span class="sourceLineNo">1364</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1364"></a>
<span class="sourceLineNo">1365</span><a name="line.1365"></a>
<span class="sourceLineNo">1366</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1366"></a>
<span class="sourceLineNo">1367</span><a name="line.1367"></a>
<span class="sourceLineNo">1368</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1368"></a>
<span class="sourceLineNo">1369</span><a name="line.1369"></a>
<span class="sourceLineNo">1370</span>                if (!da.hasFloatingPointElements()) {<a name="line.1370"></a>
<span class="sourceLineNo">1371</span>                        if (r == o) {<a name="line.1371"></a>
<span class="sourceLineNo">1372</span>                                r.fill(false);<a name="line.1372"></a>
<span class="sourceLineNo">1373</span>                        }<a name="line.1373"></a>
<span class="sourceLineNo">1374</span>                        return r;<a name="line.1374"></a>
<span class="sourceLineNo">1375</span>                }<a name="line.1375"></a>
<span class="sourceLineNo">1376</span><a name="line.1376"></a>
<span class="sourceLineNo">1377</span>                final SingleInputBroadcastIterator it = new SingleInputBroadcastIterator(da, r);<a name="line.1377"></a>
<span class="sourceLineNo">1378</span>                it.setOutputDouble(true);<a name="line.1378"></a>
<span class="sourceLineNo">1379</span>                final int as = da.getElementsPerItem();<a name="line.1379"></a>
<span class="sourceLineNo">1380</span><a name="line.1380"></a>
<span class="sourceLineNo">1381</span>                if (as == 1) {<a name="line.1381"></a>
<span class="sourceLineNo">1382</span>                        while (it.hasNext()) {<a name="line.1382"></a>
<span class="sourceLineNo">1383</span>                                r.setAbs(it.oIndex, Double.isInfinite(it.aDouble));<a name="line.1383"></a>
<span class="sourceLineNo">1384</span>                        }<a name="line.1384"></a>
<span class="sourceLineNo">1385</span>                } else {<a name="line.1385"></a>
<span class="sourceLineNo">1386</span>                        if (da instanceof ComplexFloatDataset || da instanceof ComplexDoubleDataset) {<a name="line.1386"></a>
<span class="sourceLineNo">1387</span>                                while (it.hasNext()) {<a name="line.1387"></a>
<span class="sourceLineNo">1388</span>                                        r.setAbs(it.oIndex, Double.isInfinite(it.aDouble) || Double.isInfinite(da.getElementDoubleAbs(it.aIndex + 1)));<a name="line.1388"></a>
<span class="sourceLineNo">1389</span>                                }<a name="line.1389"></a>
<span class="sourceLineNo">1390</span>                        } else {<a name="line.1390"></a>
<span class="sourceLineNo">1391</span>                                while (it.hasNext()) {<a name="line.1391"></a>
<span class="sourceLineNo">1392</span>                                        boolean rb = false;<a name="line.1392"></a>
<span class="sourceLineNo">1393</span>                                        for (int j = 0; !rb &amp;&amp; j &lt; as; j++) {<a name="line.1393"></a>
<span class="sourceLineNo">1394</span>                                                rb &amp;= Double.isInfinite(da.getElementDoubleAbs(it.aIndex + j));<a name="line.1394"></a>
<span class="sourceLineNo">1395</span>                                        }<a name="line.1395"></a>
<span class="sourceLineNo">1396</span>                                        r.setAbs(it.oIndex, rb);<a name="line.1396"></a>
<span class="sourceLineNo">1397</span>                                }<a name="line.1397"></a>
<span class="sourceLineNo">1398</span>                        }<a name="line.1398"></a>
<span class="sourceLineNo">1399</span>                }<a name="line.1399"></a>
<span class="sourceLineNo">1400</span>                return r;<a name="line.1400"></a>
<span class="sourceLineNo">1401</span>        }<a name="line.1401"></a>
<span class="sourceLineNo">1402</span><a name="line.1402"></a>
<span class="sourceLineNo">1403</span>        /**<a name="line.1403"></a>
<span class="sourceLineNo">1404</span>         * Check item-wise for whether any a's elements are positive infinite<a name="line.1404"></a>
<span class="sourceLineNo">1405</span>         * &lt;p&gt;<a name="line.1405"></a>
<span class="sourceLineNo">1406</span>         * For multi-element items, the check is true if any elements in an item is positive infinite<a name="line.1406"></a>
<span class="sourceLineNo">1407</span>         * @param a<a name="line.1407"></a>
<span class="sourceLineNo">1408</span>         * @return dataset where items are true if any of its elements are positive infinite<a name="line.1408"></a>
<span class="sourceLineNo">1409</span>         */<a name="line.1409"></a>
<span class="sourceLineNo">1410</span>        public static BooleanDataset isPositiveInfinite(Object a) {<a name="line.1410"></a>
<span class="sourceLineNo">1411</span>                return isEqual(a, null, Double.POSITIVE_INFINITY);<a name="line.1411"></a>
<span class="sourceLineNo">1412</span>        }<a name="line.1412"></a>
<span class="sourceLineNo">1413</span><a name="line.1413"></a>
<span class="sourceLineNo">1414</span>        /**<a name="line.1414"></a>
<span class="sourceLineNo">1415</span>         * Check item-wise for whether any a's elements are positive infinite<a name="line.1415"></a>
<span class="sourceLineNo">1416</span>         * &lt;p&gt;<a name="line.1416"></a>
<span class="sourceLineNo">1417</span>         * For multi-element items, the check is true if any elements in an item is positive infinite<a name="line.1417"></a>
<span class="sourceLineNo">1418</span>         * @param a<a name="line.1418"></a>
<span class="sourceLineNo">1419</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1419"></a>
<span class="sourceLineNo">1420</span>         * @return dataset where items are true if any of its elements are positive infinite<a name="line.1420"></a>
<span class="sourceLineNo">1421</span>         */<a name="line.1421"></a>
<span class="sourceLineNo">1422</span>        public static BooleanDataset isPositiveInfinite(Object a, BooleanDataset o) {<a name="line.1422"></a>
<span class="sourceLineNo">1423</span>                return isEqual(a, o, Double.POSITIVE_INFINITY);<a name="line.1423"></a>
<span class="sourceLineNo">1424</span>        }<a name="line.1424"></a>
<span class="sourceLineNo">1425</span><a name="line.1425"></a>
<span class="sourceLineNo">1426</span>        /**<a name="line.1426"></a>
<span class="sourceLineNo">1427</span>         * Check item-wise for whether any a's elements are negative infinite<a name="line.1427"></a>
<span class="sourceLineNo">1428</span>         * &lt;p&gt;<a name="line.1428"></a>
<span class="sourceLineNo">1429</span>         * For multi-element items, the check is true if any elements in an item is negative infinite<a name="line.1429"></a>
<span class="sourceLineNo">1430</span>         * @param a<a name="line.1430"></a>
<span class="sourceLineNo">1431</span>         * @return dataset where items are true if any of its elements are negative infinite<a name="line.1431"></a>
<span class="sourceLineNo">1432</span>         */<a name="line.1432"></a>
<span class="sourceLineNo">1433</span>        public static BooleanDataset isNegativeInfinite(Object a) {<a name="line.1433"></a>
<span class="sourceLineNo">1434</span>                return isEqual(a, null, Double.NEGATIVE_INFINITY);<a name="line.1434"></a>
<span class="sourceLineNo">1435</span>        }<a name="line.1435"></a>
<span class="sourceLineNo">1436</span><a name="line.1436"></a>
<span class="sourceLineNo">1437</span>        /**<a name="line.1437"></a>
<span class="sourceLineNo">1438</span>         * Check item-wise for whether any a's elements are negative infinite<a name="line.1438"></a>
<span class="sourceLineNo">1439</span>         * &lt;p&gt;<a name="line.1439"></a>
<span class="sourceLineNo">1440</span>         * For multi-element items, the check is true if any elements in an item is negative infinite<a name="line.1440"></a>
<span class="sourceLineNo">1441</span>         * @param a<a name="line.1441"></a>
<span class="sourceLineNo">1442</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1442"></a>
<span class="sourceLineNo">1443</span>         * @return dataset where items are true if any of its elements are negative infinite<a name="line.1443"></a>
<span class="sourceLineNo">1444</span>         */<a name="line.1444"></a>
<span class="sourceLineNo">1445</span>        public static BooleanDataset isNegativeInfinite(Object a, BooleanDataset o) {<a name="line.1445"></a>
<span class="sourceLineNo">1446</span>                return isEqual(a, o, Double.NEGATIVE_INFINITY);<a name="line.1446"></a>
<span class="sourceLineNo">1447</span>        }<a name="line.1447"></a>
<span class="sourceLineNo">1448</span><a name="line.1448"></a>
<span class="sourceLineNo">1449</span>        /**<a name="line.1449"></a>
<span class="sourceLineNo">1450</span>         * Check item-wise for whether any a's elements match given item<a name="line.1450"></a>
<span class="sourceLineNo">1451</span>         * &lt;p&gt;<a name="line.1451"></a>
<span class="sourceLineNo">1452</span>         * For multi-element items, the check is true if any elements in an item matches<a name="line.1452"></a>
<span class="sourceLineNo">1453</span>         * @param a<a name="line.1453"></a>
<span class="sourceLineNo">1454</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1454"></a>
<span class="sourceLineNo">1455</span>         * @param match<a name="line.1455"></a>
<span class="sourceLineNo">1456</span>         * @return dataset where items are true if any of its elements match<a name="line.1456"></a>
<span class="sourceLineNo">1457</span>         */<a name="line.1457"></a>
<span class="sourceLineNo">1458</span>        private static BooleanDataset isEqual(Object a, BooleanDataset o, final double match) {<a name="line.1458"></a>
<span class="sourceLineNo">1459</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1459"></a>
<span class="sourceLineNo">1460</span><a name="line.1460"></a>
<span class="sourceLineNo">1461</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1461"></a>
<span class="sourceLineNo">1462</span><a name="line.1462"></a>
<span class="sourceLineNo">1463</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1463"></a>
<span class="sourceLineNo">1464</span><a name="line.1464"></a>
<span class="sourceLineNo">1465</span>                if (!da.hasFloatingPointElements()) {<a name="line.1465"></a>
<span class="sourceLineNo">1466</span>                        if (r == o) {<a name="line.1466"></a>
<span class="sourceLineNo">1467</span>                                r.fill(false);<a name="line.1467"></a>
<span class="sourceLineNo">1468</span>                        }<a name="line.1468"></a>
<span class="sourceLineNo">1469</span>                        return r;<a name="line.1469"></a>
<span class="sourceLineNo">1470</span>                }<a name="line.1470"></a>
<span class="sourceLineNo">1471</span><a name="line.1471"></a>
<span class="sourceLineNo">1472</span>                final SingleInputBroadcastIterator it = new SingleInputBroadcastIterator(da, r);<a name="line.1472"></a>
<span class="sourceLineNo">1473</span>                it.setOutputDouble(true);<a name="line.1473"></a>
<span class="sourceLineNo">1474</span>                final int as = da.getElementsPerItem();<a name="line.1474"></a>
<span class="sourceLineNo">1475</span><a name="line.1475"></a>
<span class="sourceLineNo">1476</span>                if (as == 1) {<a name="line.1476"></a>
<span class="sourceLineNo">1477</span>                        while (it.hasNext()) {<a name="line.1477"></a>
<span class="sourceLineNo">1478</span>                                r.setAbs(it.oIndex, it.aDouble == match);<a name="line.1478"></a>
<span class="sourceLineNo">1479</span>                        }<a name="line.1479"></a>
<span class="sourceLineNo">1480</span>                } else {<a name="line.1480"></a>
<span class="sourceLineNo">1481</span>                        if (da instanceof ComplexFloatDataset || da instanceof ComplexDoubleDataset) {<a name="line.1481"></a>
<span class="sourceLineNo">1482</span>                                while (it.hasNext()) {<a name="line.1482"></a>
<span class="sourceLineNo">1483</span>                                        final double rv = it.aDouble;<a name="line.1483"></a>
<span class="sourceLineNo">1484</span>                                        final double iv = da.getElementDoubleAbs(it.aIndex + 1);<a name="line.1484"></a>
<span class="sourceLineNo">1485</span>                                        r.setAbs(it.oIndex, (rv == match) || (iv == match));<a name="line.1485"></a>
<span class="sourceLineNo">1486</span>                                }<a name="line.1486"></a>
<span class="sourceLineNo">1487</span>                        } else {<a name="line.1487"></a>
<span class="sourceLineNo">1488</span>                                while (it.hasNext()) {<a name="line.1488"></a>
<span class="sourceLineNo">1489</span>                                        boolean rb = false;<a name="line.1489"></a>
<span class="sourceLineNo">1490</span>                                        for (int j = 0; !rb &amp;&amp; j &lt; as; j++) {<a name="line.1490"></a>
<span class="sourceLineNo">1491</span>                                                rb &amp;= da.getElementDoubleAbs(it.aIndex + j) == match;<a name="line.1491"></a>
<span class="sourceLineNo">1492</span>                                        }<a name="line.1492"></a>
<span class="sourceLineNo">1493</span>                                        r.setAbs(it.oIndex, rb);<a name="line.1493"></a>
<span class="sourceLineNo">1494</span>                                }<a name="line.1494"></a>
<span class="sourceLineNo">1495</span>                        }<a name="line.1495"></a>
<span class="sourceLineNo">1496</span>                }<a name="line.1496"></a>
<span class="sourceLineNo">1497</span>                return r;<a name="line.1497"></a>
<span class="sourceLineNo">1498</span>        }<a name="line.1498"></a>
<span class="sourceLineNo">1499</span><a name="line.1499"></a>
<span class="sourceLineNo">1500</span>        /**<a name="line.1500"></a>
<span class="sourceLineNo">1501</span>         * Check item-wise for whether any a's elements are finite (or not infinite and not Not-a-Number)<a name="line.1501"></a>
<span class="sourceLineNo">1502</span>         * &lt;p&gt;<a name="line.1502"></a>
<span class="sourceLineNo">1503</span>         * For multi-element items, check is true if any elements in an item is finite<a name="line.1503"></a>
<span class="sourceLineNo">1504</span>         * @param a<a name="line.1504"></a>
<span class="sourceLineNo">1505</span>         * @return dataset where item is true if any of its elements are finite<a name="line.1505"></a>
<span class="sourceLineNo">1506</span>         */<a name="line.1506"></a>
<span class="sourceLineNo">1507</span>        public static BooleanDataset isFinite(Object a) {<a name="line.1507"></a>
<span class="sourceLineNo">1508</span>                return isFinite(a, null);<a name="line.1508"></a>
<span class="sourceLineNo">1509</span>        }<a name="line.1509"></a>
<span class="sourceLineNo">1510</span><a name="line.1510"></a>
<span class="sourceLineNo">1511</span>        /**<a name="line.1511"></a>
<span class="sourceLineNo">1512</span>         * Check item-wise for whether any a's elements are finite (or not infinite and not Not-a-Number)<a name="line.1512"></a>
<span class="sourceLineNo">1513</span>         * &lt;p&gt;<a name="line.1513"></a>
<span class="sourceLineNo">1514</span>         * For multi-element items, check is true if any elements in an item is finite<a name="line.1514"></a>
<span class="sourceLineNo">1515</span>         * @param a<a name="line.1515"></a>
<span class="sourceLineNo">1516</span>         * @param o output can be null - in which case, a new dataset is created<a name="line.1516"></a>
<span class="sourceLineNo">1517</span>         * @return dataset where item is true if any of its elements are finite<a name="line.1517"></a>
<span class="sourceLineNo">1518</span>         */<a name="line.1518"></a>
<span class="sourceLineNo">1519</span>        public static BooleanDataset isFinite(Object a, BooleanDataset o) {<a name="line.1519"></a>
<span class="sourceLineNo">1520</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1520"></a>
<span class="sourceLineNo">1521</span><a name="line.1521"></a>
<span class="sourceLineNo">1522</span>                List&lt;int[]&gt; sl = BroadcastUtils.broadcastShapes(da.getShapeRef(), o == null ? null : o.getShapeRef());<a name="line.1522"></a>
<span class="sourceLineNo">1523</span><a name="line.1523"></a>
<span class="sourceLineNo">1524</span>                final BooleanDataset r = o == null ? DatasetFactory.zeros(BooleanDataset.class, sl.get(0)) : o;<a name="line.1524"></a>
<span class="sourceLineNo">1525</span><a name="line.1525"></a>
<span class="sourceLineNo">1526</span>                if (!da.hasFloatingPointElements()) {<a name="line.1526"></a>
<span class="sourceLineNo">1527</span>                        r.fill(true);<a name="line.1527"></a>
<span class="sourceLineNo">1528</span>                        return r;<a name="line.1528"></a>
<span class="sourceLineNo">1529</span>                }<a name="line.1529"></a>
<span class="sourceLineNo">1530</span><a name="line.1530"></a>
<span class="sourceLineNo">1531</span>                final SingleInputBroadcastIterator it = new SingleInputBroadcastIterator(da, r);<a name="line.1531"></a>
<span class="sourceLineNo">1532</span>                it.setOutputDouble(true);<a name="line.1532"></a>
<span class="sourceLineNo">1533</span>                final int as = da.getElementsPerItem();<a name="line.1533"></a>
<span class="sourceLineNo">1534</span><a name="line.1534"></a>
<span class="sourceLineNo">1535</span>                if (as == 1) {<a name="line.1535"></a>
<span class="sourceLineNo">1536</span>                        while (it.hasNext()) {<a name="line.1536"></a>
<span class="sourceLineNo">1537</span>                                final double rv = it.aDouble;<a name="line.1537"></a>
<span class="sourceLineNo">1538</span>                                r.setAbs(it.oIndex, !(Double.isInfinite(rv) || Double.isNaN(rv)));<a name="line.1538"></a>
<span class="sourceLineNo">1539</span>                        }<a name="line.1539"></a>
<span class="sourceLineNo">1540</span>                } else {<a name="line.1540"></a>
<span class="sourceLineNo">1541</span>                        if (da instanceof ComplexFloatDataset || da instanceof ComplexDoubleDataset) {<a name="line.1541"></a>
<span class="sourceLineNo">1542</span>                                while (it.hasNext()) {<a name="line.1542"></a>
<span class="sourceLineNo">1543</span>                                        final double rv = it.aDouble;<a name="line.1543"></a>
<span class="sourceLineNo">1544</span>                                        final double iv = da.getElementDoubleAbs(it.aIndex + 1);<a name="line.1544"></a>
<span class="sourceLineNo">1545</span>                                        r.setAbs(it.oIndex, !(Double.isInfinite(rv) || Double.isNaN(rv) || Double.isInfinite(iv) || Double.isNaN(iv)));<a name="line.1545"></a>
<span class="sourceLineNo">1546</span>                                }<a name="line.1546"></a>
<span class="sourceLineNo">1547</span>                        } else {<a name="line.1547"></a>
<span class="sourceLineNo">1548</span>                                while (it.hasNext()) {<a name="line.1548"></a>
<span class="sourceLineNo">1549</span>                                        boolean rb = false;<a name="line.1549"></a>
<span class="sourceLineNo">1550</span>                                        for (int j = 0; !rb &amp;&amp; j &lt; as; j++) {<a name="line.1550"></a>
<span class="sourceLineNo">1551</span>                                                final double rv = it.aDouble;<a name="line.1551"></a>
<span class="sourceLineNo">1552</span>                                                rb &amp;= !(Double.isInfinite(rv) || Double.isNaN(rv));<a name="line.1552"></a>
<span class="sourceLineNo">1553</span>                                        }<a name="line.1553"></a>
<span class="sourceLineNo">1554</span>                                        r.setAbs(it.oIndex, rb);<a name="line.1554"></a>
<span class="sourceLineNo">1555</span>                                }<a name="line.1555"></a>
<span class="sourceLineNo">1556</span>                        }<a name="line.1556"></a>
<span class="sourceLineNo">1557</span>                }<a name="line.1557"></a>
<span class="sourceLineNo">1558</span>                return r;<a name="line.1558"></a>
<span class="sourceLineNo">1559</span>        }<a name="line.1559"></a>
<span class="sourceLineNo">1560</span><a name="line.1560"></a>
<span class="sourceLineNo">1561</span>        /**<a name="line.1561"></a>
<span class="sourceLineNo">1562</span>         * Enumeration of monotonicity. NaNs are ignored or considered not equal<a name="line.1562"></a>
<span class="sourceLineNo">1563</span>         */<a name="line.1563"></a>
<span class="sourceLineNo">1564</span>        public static enum Monotonicity {<a name="line.1564"></a>
<span class="sourceLineNo">1565</span>                /**<a name="line.1565"></a>
<span class="sourceLineNo">1566</span>                 * No order: {@code x_0 != x_1 != x_2 ...}<a name="line.1566"></a>
<span class="sourceLineNo">1567</span>                 */<a name="line.1567"></a>
<span class="sourceLineNo">1568</span>                NOT_ORDERED,<a name="line.1568"></a>
<span class="sourceLineNo">1569</span>                /**<a name="line.1569"></a>
<span class="sourceLineNo">1570</span>                 * All equal: {@code x_0 == x_1 == x_2 ...}<a name="line.1570"></a>
<span class="sourceLineNo">1571</span>                 */<a name="line.1571"></a>
<span class="sourceLineNo">1572</span>                ALL_EQUAL,<a name="line.1572"></a>
<span class="sourceLineNo">1573</span>                /**<a name="line.1573"></a>
<span class="sourceLineNo">1574</span>                 * Strictly decreasing {@code x_0 &gt; x_1 &gt; x_2 ...}<a name="line.1574"></a>
<span class="sourceLineNo">1575</span>                 */<a name="line.1575"></a>
<span class="sourceLineNo">1576</span>                STRICTLY_DECREASING,<a name="line.1576"></a>
<span class="sourceLineNo">1577</span>                /**<a name="line.1577"></a>
<span class="sourceLineNo">1578</span>                 * Non-increasing or weakly decreasing {@code x_0 &gt;= x_1 &gt;= x_2 ...}<a name="line.1578"></a>
<span class="sourceLineNo">1579</span>                 */<a name="line.1579"></a>
<span class="sourceLineNo">1580</span>                NONINCREASING,<a name="line.1580"></a>
<span class="sourceLineNo">1581</span>                /**<a name="line.1581"></a>
<span class="sourceLineNo">1582</span>                 * Non-decreasing or weakly increasing {@code x_0 &lt;= x_1 &lt;= x_2 ...}<a name="line.1582"></a>
<span class="sourceLineNo">1583</span>                 */<a name="line.1583"></a>
<span class="sourceLineNo">1584</span>                NONDECREASING,<a name="line.1584"></a>
<span class="sourceLineNo">1585</span>                /**<a name="line.1585"></a>
<span class="sourceLineNo">1586</span>                 * Strictly increasing {@code x_0 &lt; x_1 &lt; x_2 ...}<a name="line.1586"></a>
<span class="sourceLineNo">1587</span>                 */<a name="line.1587"></a>
<span class="sourceLineNo">1588</span>                STRICTLY_INCREASING,<a name="line.1588"></a>
<span class="sourceLineNo">1589</span>        }<a name="line.1589"></a>
<span class="sourceLineNo">1590</span><a name="line.1590"></a>
<span class="sourceLineNo">1591</span>        /**<a name="line.1591"></a>
<span class="sourceLineNo">1592</span>         * @param a<a name="line.1592"></a>
<span class="sourceLineNo">1593</span>         * @return true if all elements are in a monotonic order<a name="line.1593"></a>
<span class="sourceLineNo">1594</span>         * @see #findMonotonicity(Object)<a name="line.1594"></a>
<span class="sourceLineNo">1595</span>         */<a name="line.1595"></a>
<span class="sourceLineNo">1596</span>        public static boolean isMonotonic(Object a) {<a name="line.1596"></a>
<span class="sourceLineNo">1597</span>                return findMonotonicity(a) != Monotonicity.NOT_ORDERED;<a name="line.1597"></a>
<span class="sourceLineNo">1598</span>        }<a name="line.1598"></a>
<span class="sourceLineNo">1599</span><a name="line.1599"></a>
<span class="sourceLineNo">1600</span>        /**<a name="line.1600"></a>
<span class="sourceLineNo">1601</span>         * @param a<a name="line.1601"></a>
<span class="sourceLineNo">1602</span>         * @param monotonicity<a name="line.1602"></a>
<span class="sourceLineNo">1603</span>         * @return true if all elements are in given monotonic ordering<a name="line.1603"></a>
<span class="sourceLineNo">1604</span>         */<a name="line.1604"></a>
<span class="sourceLineNo">1605</span>        public static boolean isMonotonic(Object a, Monotonicity monotonicity) {<a name="line.1605"></a>
<span class="sourceLineNo">1606</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1606"></a>
<span class="sourceLineNo">1607</span>                if (da.getRank() &gt; 1) {<a name="line.1607"></a>
<span class="sourceLineNo">1608</span>                        throw new IllegalArgumentException("Only 0 or 1D datasets are allowed");<a name="line.1608"></a>
<span class="sourceLineNo">1609</span>                }<a name="line.1609"></a>
<span class="sourceLineNo">1610</span><a name="line.1610"></a>
<span class="sourceLineNo">1611</span>                if (da.getElementsPerItem() &gt; 1) {<a name="line.1611"></a>
<span class="sourceLineNo">1612</span>                        throw new IllegalArgumentException("Cannot compare compound datsets");<a name="line.1612"></a>
<span class="sourceLineNo">1613</span>                }<a name="line.1613"></a>
<span class="sourceLineNo">1614</span><a name="line.1614"></a>
<span class="sourceLineNo">1615</span>                final IndexIterator it = da.getIterator();<a name="line.1615"></a>
<span class="sourceLineNo">1616</span>                double previous = Double.NaN;<a name="line.1616"></a>
<span class="sourceLineNo">1617</span>                while (Double.isNaN(previous) &amp;&amp; it.hasNext()) { // look for first non-NaN<a name="line.1617"></a>
<span class="sourceLineNo">1618</span>                        previous = da.getElementDoubleAbs(it.index);<a name="line.1618"></a>
<span class="sourceLineNo">1619</span>                }<a name="line.1619"></a>
<span class="sourceLineNo">1620</span><a name="line.1620"></a>
<span class="sourceLineNo">1621</span>                Boolean increasing = null;<a name="line.1621"></a>
<span class="sourceLineNo">1622</span>                boolean equality = false;<a name="line.1622"></a>
<span class="sourceLineNo">1623</span>                while (it.hasNext()) { // look for first change<a name="line.1623"></a>
<span class="sourceLineNo">1624</span>                        double next = da.getElementDoubleAbs(it.index);<a name="line.1624"></a>
<span class="sourceLineNo">1625</span>                        if (!Double.isNaN(next)) {<a name="line.1625"></a>
<span class="sourceLineNo">1626</span>                                if (previous != next) {<a name="line.1626"></a>
<span class="sourceLineNo">1627</span>                                        increasing = previous &lt; next;<a name="line.1627"></a>
<span class="sourceLineNo">1628</span>                                        previous = next;<a name="line.1628"></a>
<span class="sourceLineNo">1629</span>                                        break;<a name="line.1629"></a>
<span class="sourceLineNo">1630</span>                                } else if (!equality) {<a name="line.1630"></a>
<span class="sourceLineNo">1631</span>                                        equality = true;<a name="line.1631"></a>
<span class="sourceLineNo">1632</span>                                        if (monotonicity == Monotonicity.STRICTLY_DECREASING || monotonicity == Monotonicity.STRICTLY_DECREASING)<a name="line.1632"></a>
<span class="sourceLineNo">1633</span>                                                return false;<a name="line.1633"></a>
<span class="sourceLineNo">1634</span>                                }<a name="line.1634"></a>
<span class="sourceLineNo">1635</span>                        }<a name="line.1635"></a>
<span class="sourceLineNo">1636</span>                }<a name="line.1636"></a>
<span class="sourceLineNo">1637</span><a name="line.1637"></a>
<span class="sourceLineNo">1638</span>                if (increasing == null) {<a name="line.1638"></a>
<span class="sourceLineNo">1639</span>                        if (equality)<a name="line.1639"></a>
<span class="sourceLineNo">1640</span>                                return monotonicity == Monotonicity.ALL_EQUAL || monotonicity == Monotonicity.NONDECREASING || monotonicity == Monotonicity.NONINCREASING;<a name="line.1640"></a>
<span class="sourceLineNo">1641</span>                        return Double.isNaN(previous) ? monotonicity == Monotonicity.NOT_ORDERED : true;<a name="line.1641"></a>
<span class="sourceLineNo">1642</span>                }<a name="line.1642"></a>
<span class="sourceLineNo">1643</span><a name="line.1643"></a>
<span class="sourceLineNo">1644</span>                if (increasing) {<a name="line.1644"></a>
<span class="sourceLineNo">1645</span>                        if (monotonicity == Monotonicity.ALL_EQUAL || monotonicity == Monotonicity.NONINCREASING || monotonicity == Monotonicity.STRICTLY_DECREASING)<a name="line.1645"></a>
<span class="sourceLineNo">1646</span>                                return false;<a name="line.1646"></a>
<span class="sourceLineNo">1647</span><a name="line.1647"></a>
<span class="sourceLineNo">1648</span>                        while (it.hasNext()) {<a name="line.1648"></a>
<span class="sourceLineNo">1649</span>                                double next = da.getElementDoubleAbs(it.index);<a name="line.1649"></a>
<span class="sourceLineNo">1650</span>                                if (!Double.isNaN(next)) {<a name="line.1650"></a>
<span class="sourceLineNo">1651</span>                                        if (previous &gt; next) {<a name="line.1651"></a>
<span class="sourceLineNo">1652</span>                                                return monotonicity == Monotonicity.NOT_ORDERED;<a name="line.1652"></a>
<span class="sourceLineNo">1653</span>                                        } else if (previous &lt; next) {<a name="line.1653"></a>
<span class="sourceLineNo">1654</span>                                                previous = next;<a name="line.1654"></a>
<span class="sourceLineNo">1655</span>                                        } else if (!equality) {<a name="line.1655"></a>
<span class="sourceLineNo">1656</span>                                                equality = true;<a name="line.1656"></a>
<span class="sourceLineNo">1657</span>                                                if (monotonicity == Monotonicity.STRICTLY_INCREASING)<a name="line.1657"></a>
<span class="sourceLineNo">1658</span>                                                        return false;<a name="line.1658"></a>
<span class="sourceLineNo">1659</span>                                        }<a name="line.1659"></a>
<span class="sourceLineNo">1660</span>                                }<a name="line.1660"></a>
<span class="sourceLineNo">1661</span>                        }<a name="line.1661"></a>
<span class="sourceLineNo">1662</span><a name="line.1662"></a>
<span class="sourceLineNo">1663</span>                        return monotonicity != Monotonicity.NOT_ORDERED;<a name="line.1663"></a>
<span class="sourceLineNo">1664</span>                }<a name="line.1664"></a>
<span class="sourceLineNo">1665</span><a name="line.1665"></a>
<span class="sourceLineNo">1666</span>                if (monotonicity == Monotonicity.ALL_EQUAL || monotonicity == Monotonicity.NONDECREASING || monotonicity == Monotonicity.STRICTLY_INCREASING)<a name="line.1666"></a>
<span class="sourceLineNo">1667</span>                        return false;<a name="line.1667"></a>
<span class="sourceLineNo">1668</span><a name="line.1668"></a>
<span class="sourceLineNo">1669</span>                while (it.hasNext()) {<a name="line.1669"></a>
<span class="sourceLineNo">1670</span>                        double next = da.getElementDoubleAbs(it.index);<a name="line.1670"></a>
<span class="sourceLineNo">1671</span>                        if (!Double.isNaN(next)) {<a name="line.1671"></a>
<span class="sourceLineNo">1672</span>                                if (previous &lt; next) {<a name="line.1672"></a>
<span class="sourceLineNo">1673</span>                                        return monotonicity == Monotonicity.NOT_ORDERED;<a name="line.1673"></a>
<span class="sourceLineNo">1674</span>                                } else if (previous &gt; next) {<a name="line.1674"></a>
<span class="sourceLineNo">1675</span>                                        previous = next;<a name="line.1675"></a>
<span class="sourceLineNo">1676</span>                                } else if (!equality) {<a name="line.1676"></a>
<span class="sourceLineNo">1677</span>                                        equality = true;<a name="line.1677"></a>
<span class="sourceLineNo">1678</span>                                        if (monotonicity == Monotonicity.STRICTLY_DECREASING)<a name="line.1678"></a>
<span class="sourceLineNo">1679</span>                                                return false;<a name="line.1679"></a>
<span class="sourceLineNo">1680</span>                                }<a name="line.1680"></a>
<span class="sourceLineNo">1681</span>                        }<a name="line.1681"></a>
<span class="sourceLineNo">1682</span>                }<a name="line.1682"></a>
<span class="sourceLineNo">1683</span><a name="line.1683"></a>
<span class="sourceLineNo">1684</span>                return monotonicity != Monotonicity.NOT_ORDERED;<a name="line.1684"></a>
<span class="sourceLineNo">1685</span>        }<a name="line.1685"></a>
<span class="sourceLineNo">1686</span><a name="line.1686"></a>
<span class="sourceLineNo">1687</span>        /**<a name="line.1687"></a>
<span class="sourceLineNo">1688</span>         * @param a<a name="line.1688"></a>
<span class="sourceLineNo">1689</span>         * @return true if all elements are in a strictly monotonic order<a name="line.1689"></a>
<span class="sourceLineNo">1690</span>         * @see #findMonotonicity(Object)<a name="line.1690"></a>
<span class="sourceLineNo">1691</span>         */<a name="line.1691"></a>
<span class="sourceLineNo">1692</span>        public static boolean isStrictlyMonotonic(Object a) {<a name="line.1692"></a>
<span class="sourceLineNo">1693</span>                Monotonicity mono = findMonotonicity(a);<a name="line.1693"></a>
<span class="sourceLineNo">1694</span>                return mono == Monotonicity.STRICTLY_DECREASING || mono == Monotonicity.STRICTLY_INCREASING;<a name="line.1694"></a>
<span class="sourceLineNo">1695</span>        }<a name="line.1695"></a>
<span class="sourceLineNo">1696</span><a name="line.1696"></a>
<span class="sourceLineNo">1697</span>        /**<a name="line.1697"></a>
<span class="sourceLineNo">1698</span>         * Find monotonicity. NaNs are ignored or considered not equal<a name="line.1698"></a>
<span class="sourceLineNo">1699</span>         * @param a<a name="line.1699"></a>
<span class="sourceLineNo">1700</span>         * @return monotonicity<a name="line.1700"></a>
<span class="sourceLineNo">1701</span>         */<a name="line.1701"></a>
<span class="sourceLineNo">1702</span>        public static Monotonicity findMonotonicity(Object a) {<a name="line.1702"></a>
<span class="sourceLineNo">1703</span>                final Dataset da = a instanceof Dataset ? (Dataset) a : DatasetFactory.createFromObject(a);<a name="line.1703"></a>
<span class="sourceLineNo">1704</span>                if (da.getRank() &gt; 1) {<a name="line.1704"></a>
<span class="sourceLineNo">1705</span>                        throw new IllegalArgumentException("Only 0 or 1D datasets are allowed");<a name="line.1705"></a>
<span class="sourceLineNo">1706</span>                }<a name="line.1706"></a>
<span class="sourceLineNo">1707</span><a name="line.1707"></a>
<span class="sourceLineNo">1708</span>                if (da.getElementsPerItem() &gt; 1) {<a name="line.1708"></a>
<span class="sourceLineNo">1709</span>                        throw new IllegalArgumentException("Cannot compare compound datsets");<a name="line.1709"></a>
<span class="sourceLineNo">1710</span>                }<a name="line.1710"></a>
<span class="sourceLineNo">1711</span><a name="line.1711"></a>
<span class="sourceLineNo">1712</span>                final IndexIterator it = da.getIterator();<a name="line.1712"></a>
<span class="sourceLineNo">1713</span>                double previous = Double.NaN;<a name="line.1713"></a>
<span class="sourceLineNo">1714</span>                while (Double.isNaN(previous) &amp;&amp; it.hasNext()) { // look for first non-NaN<a name="line.1714"></a>
<span class="sourceLineNo">1715</span>                        previous = da.getElementDoubleAbs(it.index);<a name="line.1715"></a>
<span class="sourceLineNo">1716</span>                }<a name="line.1716"></a>
<span class="sourceLineNo">1717</span><a name="line.1717"></a>
<span class="sourceLineNo">1718</span>                Boolean increasing = null;<a name="line.1718"></a>
<span class="sourceLineNo">1719</span>                boolean equality = false;<a name="line.1719"></a>
<span class="sourceLineNo">1720</span>                while (it.hasNext()) { // look for first change<a name="line.1720"></a>
<span class="sourceLineNo">1721</span>                        double next = da.getElementDoubleAbs(it.index);<a name="line.1721"></a>
<span class="sourceLineNo">1722</span>                        if (!Double.isNaN(next)) {<a name="line.1722"></a>
<span class="sourceLineNo">1723</span>                                if (previous != next) {<a name="line.1723"></a>
<span class="sourceLineNo">1724</span>                                        increasing = previous &lt; next;<a name="line.1724"></a>
<span class="sourceLineNo">1725</span>                                        previous = next;<a name="line.1725"></a>
<span class="sourceLineNo">1726</span>                                        break;<a name="line.1726"></a>
<span class="sourceLineNo">1727</span>                                } else if (!equality) {<a name="line.1727"></a>
<span class="sourceLineNo">1728</span>                                        equality = true;<a name="line.1728"></a>
<span class="sourceLineNo">1729</span>                                }<a name="line.1729"></a>
<span class="sourceLineNo">1730</span>                        }<a name="line.1730"></a>
<span class="sourceLineNo">1731</span>                }<a name="line.1731"></a>
<span class="sourceLineNo">1732</span><a name="line.1732"></a>
<span class="sourceLineNo">1733</span>                if (increasing == null) {<a name="line.1733"></a>
<span class="sourceLineNo">1734</span>                        return Double.isNaN(previous) ? Monotonicity.NOT_ORDERED : Monotonicity.ALL_EQUAL;<a name="line.1734"></a>
<span class="sourceLineNo">1735</span>                }<a name="line.1735"></a>
<span class="sourceLineNo">1736</span><a name="line.1736"></a>
<span class="sourceLineNo">1737</span>                if (increasing) {<a name="line.1737"></a>
<span class="sourceLineNo">1738</span>                        while (it.hasNext()) {<a name="line.1738"></a>
<span class="sourceLineNo">1739</span>                                double next = da.getElementDoubleAbs(it.index);<a name="line.1739"></a>
<span class="sourceLineNo">1740</span>                                if (!Double.isNaN(next)) {<a name="line.1740"></a>
<span class="sourceLineNo">1741</span>                                        if (previous &gt; next) {<a name="line.1741"></a>
<span class="sourceLineNo">1742</span>                                                return Monotonicity.NOT_ORDERED;<a name="line.1742"></a>
<span class="sourceLineNo">1743</span>                                        } else if (previous &lt; next) {<a name="line.1743"></a>
<span class="sourceLineNo">1744</span>                                                previous = next;<a name="line.1744"></a>
<span class="sourceLineNo">1745</span>                                        } else if (!equality) {<a name="line.1745"></a>
<span class="sourceLineNo">1746</span>                                                equality = true;<a name="line.1746"></a>
<span class="sourceLineNo">1747</span>                                        }<a name="line.1747"></a>
<span class="sourceLineNo">1748</span>                                }<a name="line.1748"></a>
<span class="sourceLineNo">1749</span>                        }<a name="line.1749"></a>
<span class="sourceLineNo">1750</span>                        return equality ? Monotonicity.NONDECREASING : Monotonicity.STRICTLY_INCREASING;<a name="line.1750"></a>
<span class="sourceLineNo">1751</span>                }<a name="line.1751"></a>
<span class="sourceLineNo">1752</span><a name="line.1752"></a>
<span class="sourceLineNo">1753</span>                while (it.hasNext()) {<a name="line.1753"></a>
<span class="sourceLineNo">1754</span>                        double next = da.getElementDoubleAbs(it.index);<a name="line.1754"></a>
<span class="sourceLineNo">1755</span>                        if (!Double.isNaN(next)) {<a name="line.1755"></a>
<span class="sourceLineNo">1756</span>                                if (previous &lt; next) {<a name="line.1756"></a>
<span class="sourceLineNo">1757</span>                                        return Monotonicity.NOT_ORDERED;<a name="line.1757"></a>
<span class="sourceLineNo">1758</span>                                } else if (previous &gt; next) {<a name="line.1758"></a>
<span class="sourceLineNo">1759</span>                                        previous = next;<a name="line.1759"></a>
<span class="sourceLineNo">1760</span>                                } else if (!equality) {<a name="line.1760"></a>
<span class="sourceLineNo">1761</span>                                        equality = true;<a name="line.1761"></a>
<span class="sourceLineNo">1762</span>                                }<a name="line.1762"></a>
<span class="sourceLineNo">1763</span>                        }<a name="line.1763"></a>
<span class="sourceLineNo">1764</span>                }<a name="line.1764"></a>
<span class="sourceLineNo">1765</span>                return equality ? Monotonicity.NONINCREASING : Monotonicity.STRICTLY_DECREASING;<a name="line.1765"></a>
<span class="sourceLineNo">1766</span>        }<a name="line.1766"></a>
<span class="sourceLineNo">1767</span>}<a name="line.1767"></a>




























































</pre>
</div>
</body>
</html>
