def ifun_get_index(self, cf, index): from mcdp_dp.dp_flatten import TakeFun from mocdp.comp.wrap import SimpleWrap if not cf in self.indexed_fun: F = self.get_ftype(cf) n = len(F.subs) # todo: use labels if isinstance(F, PosetProductWithLabels): fnames = list(F.labels) else: fnames = ['_f%d' % i for i in range(n)] coords = list(range(n)) dp = TakeFun(F, coords) ndp_out = '_muxed' ndp = SimpleWrap(dp, fnames=fnames, rnames=ndp_out) ndp_name = self.new_name('_indexing') self.add_ndp(ndp_name, ndp) c = Connection(dp1=ndp_name, s1=ndp_out, dp2=cf.dp, s2=cf.s) self.add_connection(c) self.indexed_fun[cf] = ndp_name ndp_name = self.indexed_fun[cf] ndp = self.names[ndp_name] fnames = ndp.get_fnames() n = len(fnames) s = fnames[index] if not (0 <= index < n): msg = 'Out of bounds.' raise_desc(DPSemanticError, msg, index=index, F=F) res = self.make_function(ndp_name, s) return res