def from_other(cls, ori, **kwargs):
        for k in cls._attrs_to_copy + ('params', 'roots', 'init_indep', 'init_dep'):
            if k not in kwargs:
                val = getattr(ori, k)
                if val is not None:
                    kwargs[k] = val
        if 'lower_bounds' not in kwargs and getattr(ori, 'lower_bounds') is not None:
            kwargs['lower_bounds'] = ori.lower_bounds
        if 'upper_bounds' not in kwargs and getattr(ori, 'upper_bounds') is not None:
            kwargs['upper_bounds'] = ori.upper_bounds
        if len(ori.pre_processors) > 0:
            if 'pre_processors' not in kwargs:
                kwargs['pre_processors'] = []
            kwargs['pre_processors'] = kwargs['pre_processors'] + ori.pre_processors
        if len(ori.post_processors) > 0:
            if 'post_processors' not in kwargs:
                kwargs['post_processors'] = []
            kwargs['post_processors'] = ori.post_processors + kwargs['post_processors']
        if 'dep_exprs' not in kwargs:
            kwargs['dep_exprs'] = zip(ori.dep, ori.exprs)
        if 'indep' not in kwargs:
            kwargs['indep'] = ori.indep
        instance = cls(**kwargs)
        for attr in ori._attrs_to_copy:
            if attr not in cls._attrs_to_copy:
                setattr(instance, attr, getattr(ori, attr))
        return instance